SlideShare ist ein Scribd-Unternehmen logo
1 von 12
Downloaden Sie, um offline zu lesen
Common Lisp как второй
язык программирования



Валерий Замараев
@valeryz
Направления

● Моделирование

● Прототипирование

● Кодогенерация


А также источник идей и вдохновения!
Пример: Модель распределенной
системы

 ● Имитационное моделирование
   BitTorrent-подобного протокола

 ● Экспериментирование с протоколом
   без создания системы и
   развертывания десятков тысяч
   клиентов
Пример: реализация PGP
верификатора

● Gnu PG - лицензия GPL, нет библиотеки,
  libgpg работает путем вызова внешнего
  бинарика

● Нет возможности втягивать "тяжелые"
  библиотеки типа OpenSSL

● Найденные альтернативные opensource
  реализации очень сложны и недоделаны
Пример: реализация PGP
верификатора


● Решение: свой велосипед на C

● А перед этим - разведка боем с
  помощью CL
Пример: генерация PHP кода
● PHP – идеальный язык для программирования в
   «макаронном» стиле
● Код в таком «макаронном» стиле лучше не писать,
   а генерировать
● Какой язык должен быть на верхнем уровне?


● GitHub: https://github.com/valeryz/MacroPHP
Более рабочий пример:
ParenScript

                                  function (x) {
 (lambda (x)                         switch (x) {
   (case x                           case 1:
                                        for (var _js1 = 0; _js1 < 3; _js1 += 1) {
    (1 (loop repeat 3 do (alert
                                           alert('foo');
 "foo")))                               };
    (:bar (alert "bar"))                return null;
    (otherwise 4)))                  case 'bar':
                                        return alert('bar');
                                     default:
                                        return 4;
                                     };
                                  };
Какие свойства языка полезны для
таких применений?

 ●   Интерактивность и инкрементность
 ●   Легкая работа со списками
 ●   Замыкания
 ●   Макросы



 ● CFFI
CFFI – как ctypes, только лучше

(defcstruct timeval (tv_sec :long) (tv_usec :long))

(with-foreign-object (tv 'timeval)
     (foreign-funcall "gettimeofday" :pointer tv :pointer (null-pointer))
     (with-foreign-slots ((tv_sec tv_usec) tv timeval)
      (format t "Seconds: ~A~%Microseconds ~A~%" tv_sec tv_usec)))
Немного CL vs. Python флейма

 ● context-менеджеры и with слизаны с
   Лиспа, но в Лиспе все намного проще

 ● MRO, метаклассы - все из CLOS

 ● Но очень не хватает генераторов!
   Решения есть, но все не очень простые
Что почитать для начала?
● Эссе Пола Грэма
  http://paulgraham.com/lispart.html

● Practical Common Lisp http://www.
  gigamonkeys.com/book/
Спасибо



Контакты:

twitter: @valeryz
github: valeryz

Weitere ähnliche Inhalte

Was ist angesagt?

Базовые конструкции языка программирования
Базовые конструкции языка программированияБазовые конструкции языка программирования
Базовые конструкции языка программирования
slbazhenova
 
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклы
dasha2012
 

Was ist angesagt? (20)

язык програмирования
язык програмированияязык програмирования
язык програмирования
 
Базовые конструкции языка программирования
Базовые конструкции языка программированияБазовые конструкции языка программирования
Базовые конструкции языка программирования
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
 
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчик
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
 
106170
106170106170
106170
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPI
 
JavaScript Intro
JavaScript IntroJavaScript Intro
JavaScript Intro
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
 
указатель на функцию
указатель на функциюуказатель на функцию
указатель на функцию
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
 
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклы
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
 

Andere mochten auch

Communicate: An Introduction
Communicate: An IntroductionCommunicate: An Introduction
Communicate: An Introduction
CommunicateTori
 
10.1.1.196.7508
10.1.1.196.750810.1.1.196.7508
10.1.1.196.7508
duyliemvnu
 
Estimating life expectancy 8 oct 12_v3_monarch
Estimating life expectancy 8 oct 12_v3_monarchEstimating life expectancy 8 oct 12_v3_monarch
Estimating life expectancy 8 oct 12_v3_monarch
royherman24
 

Andere mochten auch (17)

Централизованная система управления учетными за
Централизованная система управления учетными заЦентрализованная система управления учетными за
Централизованная система управления учетными за
 
Presentacions jornada projectes innovi varietats autoresistents
Presentacions jornada projectes innovi varietats autoresistentsPresentacions jornada projectes innovi varietats autoresistents
Presentacions jornada projectes innovi varietats autoresistents
 
Communicate: An Introduction
Communicate: An IntroductionCommunicate: An Introduction
Communicate: An Introduction
 
BALpoint
BALpointBALpoint
BALpoint
 
Progress project 2012
Progress project 2012Progress project 2012
Progress project 2012
 
uba_CNews
uba_CNewsuba_CNews
uba_CNews
 
20150514-Jornada tècnica Agricultura de precisió com a eina vitivinícola-JGir...
20150514-Jornada tècnica Agricultura de precisió com a eina vitivinícola-JGir...20150514-Jornada tècnica Agricultura de precisió com a eina vitivinícola-JGir...
20150514-Jornada tècnica Agricultura de precisió com a eina vitivinícola-JGir...
 
Presentacions jornada projectes innovi nova plataforma web
Presentacions jornada projectes innovi nova plataforma webPresentacions jornada projectes innovi nova plataforma web
Presentacions jornada projectes innovi nova plataforma web
 
Gbb open presentation
Gbb open presentationGbb open presentation
Gbb open presentation
 
Partners11.21.12
Partners11.21.12Partners11.21.12
Partners11.21.12
 
10.1.1.196.7508
10.1.1.196.750810.1.1.196.7508
10.1.1.196.7508
 
Poda suau (ENG)
Poda suau (ENG)Poda suau (ENG)
Poda suau (ENG)
 
TT3161_Afonin
TT3161_AfoninTT3161_Afonin
TT3161_Afonin
 
Pxgm 6102
Pxgm 6102Pxgm 6102
Pxgm 6102
 
IntellectTrans-2013
IntellectTrans-2013IntellectTrans-2013
IntellectTrans-2013
 
Lisp
LispLisp
Lisp
 
Estimating life expectancy 8 oct 12_v3_monarch
Estimating life expectancy 8 oct 12_v3_monarchEstimating life expectancy 8 oct 12_v3_monarch
Estimating life expectancy 8 oct 12_v3_monarch
 

Ähnlich wie Common Lisp как второй язык

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Daniel Podolsky
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
ScalaNsk
 
Языки программирования
Языки программированияЯзыки программирования
Языки программирования
paulsmirnov
 
javascript
javascriptjavascript
javascript
sovest
 
javascript_part1
javascript_part1javascript_part1
javascript_part1
sovest
 
Отладка в Python: 2016 edition
Отладка в Python: 2016 editionОтладка в Python: 2016 edition
Отладка в Python: 2016 edition
Кирилл Борисов
 
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Ontico
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo
 

Ähnlich wie Common Lisp как второй язык (20)

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
The basic design of the PHP language
 The basic design of the PHP language The basic design of the PHP language
The basic design of the PHP language
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
 
Языки программирования
Языки программированияЯзыки программирования
Языки программирования
 
javascript
javascriptjavascript
javascript
 
javascript_part1
javascript_part1javascript_part1
javascript_part1
 
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
 
Александр Гладыш — Lua
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — Lua
 
Отладка в Python: 2016 edition
Отладка в Python: 2016 editionОтладка в Python: 2016 edition
Отладка в Python: 2016 edition
 
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
Сравнение форматов и библиотек сериализации / Антон Рыжов (Qrator Labs)
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the BeastAlexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
 

Common Lisp как второй язык

  • 1. Common Lisp как второй язык программирования Валерий Замараев @valeryz
  • 2. Направления ● Моделирование ● Прототипирование ● Кодогенерация А также источник идей и вдохновения!
  • 3. Пример: Модель распределенной системы ● Имитационное моделирование BitTorrent-подобного протокола ● Экспериментирование с протоколом без создания системы и развертывания десятков тысяч клиентов
  • 4. Пример: реализация PGP верификатора ● Gnu PG - лицензия GPL, нет библиотеки, libgpg работает путем вызова внешнего бинарика ● Нет возможности втягивать "тяжелые" библиотеки типа OpenSSL ● Найденные альтернативные opensource реализации очень сложны и недоделаны
  • 5. Пример: реализация PGP верификатора ● Решение: свой велосипед на C ● А перед этим - разведка боем с помощью CL
  • 6. Пример: генерация PHP кода ● PHP – идеальный язык для программирования в «макаронном» стиле ● Код в таком «макаронном» стиле лучше не писать, а генерировать ● Какой язык должен быть на верхнем уровне? ● GitHub: https://github.com/valeryz/MacroPHP
  • 7. Более рабочий пример: ParenScript function (x) { (lambda (x) switch (x) { (case x case 1: for (var _js1 = 0; _js1 < 3; _js1 += 1) { (1 (loop repeat 3 do (alert alert('foo'); "foo"))) }; (:bar (alert "bar")) return null; (otherwise 4))) case 'bar': return alert('bar'); default: return 4; }; };
  • 8. Какие свойства языка полезны для таких применений? ● Интерактивность и инкрементность ● Легкая работа со списками ● Замыкания ● Макросы ● CFFI
  • 9. CFFI – как ctypes, только лучше (defcstruct timeval (tv_sec :long) (tv_usec :long)) (with-foreign-object (tv 'timeval) (foreign-funcall "gettimeofday" :pointer tv :pointer (null-pointer)) (with-foreign-slots ((tv_sec tv_usec) tv timeval) (format t "Seconds: ~A~%Microseconds ~A~%" tv_sec tv_usec)))
  • 10. Немного CL vs. Python флейма ● context-менеджеры и with слизаны с Лиспа, но в Лиспе все намного проще ● MRO, метаклассы - все из CLOS ● Но очень не хватает генераторов! Решения есть, но все не очень простые
  • 11. Что почитать для начала? ● Эссе Пола Грэма http://paulgraham.com/lispart.html ● Practical Common Lisp http://www. gigamonkeys.com/book/