ݺߣ

ݺߣShare a Scribd company logo
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

More Related Content

What's hot (20)

язык програмирования
язык програмированияязык програмирования
язык програмирования
Olegmingalev1997
Базовые конструкции языка программирования
Базовые конструкции языка программированияБазовые конструкции языка программирования
Базовые конструкции языка программирования
slbazhenova
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Ontico
Python и Cython
Python и CythonPython и Cython
Python и Cython
Alexander Shigin
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
Mikhail Shcherbakov
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
Mikhail Shcherbakov
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчик
IT61
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
Mikhail Shcherbakov
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
Yandex
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPI
Alexey Paznikov
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
Sergey Zubkov
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
Alexey Paznikov
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Python Meetup
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Alexey Paznikov
указатель на функцию
указатель на функциюуказатель на функцию
указатель на функцию
Aleksandr Pavlenko
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Alexey Paznikov
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклы
dasha2012
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Alexey Paznikov
язык програмирования
язык програмированияязык програмирования
язык програмирования
Olegmingalev1997
Базовые конструкции языка программирования
Базовые конструкции языка программированияБазовые конструкции языка программирования
Базовые конструкции языка программирования
slbazhenova
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Ontico
Когда в C# не хватает C++ . Часть 2.
Когда в C# не хватает C++. Часть 2.Когда в C# не хватает C++. Часть 2.
Когда в C# не хватает C++ . Часть 2.
Mikhail Shcherbakov
Когда в C# не хватает C++
Когда в C# не хватает C++Когда в C# не хватает C++
Когда в C# не хватает C++
Mikhail Shcherbakov
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчик
IT61
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
Mikhail Shcherbakov
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
Yandex
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPI
Alexey Paznikov
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
Alexey Paznikov
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Python Meetup
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Alexey Paznikov
указатель на функцию
указатель на функциюуказатель на функцию
указатель на функцию
Aleksandr Pavlenko
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Alexey Paznikov
ветвление.условный оператор.циклы
ветвление.условный оператор.циклыветвление.условный оператор.циклы
ветвление.условный оператор.циклы
dasha2012
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Alexey Paznikov

Viewers also liked (17)

Централизованная система управления учетными за
Централизованная система управления учетными заЦентрализованная система управления учетными за
Централизованная система управления учетными за
Eugene Afonin
Presentacions jornada projectes innovi varietats autoresistents
Presentacions jornada projectes innovi varietats autoresistentsPresentacions jornada projectes innovi varietats autoresistents
Presentacions jornada projectes innovi varietats autoresistents
Associació AEI INNOVI
Progress project 2012
Progress project 2012Progress project 2012
Progress project 2012
agsman_2007
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...
Associació AEI INNOVI
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
Associació AEI INNOVI
Gbb open presentation
Gbb open presentationGbb open presentation
Gbb open presentation
Valeriy Zamarayev
Partners11.21.12
Partners11.21.12Partners11.21.12
Partners11.21.12
joshuahinchley
10.1.1.196.7508
10.1.1.196.750810.1.1.196.7508
10.1.1.196.7508
duyliemvnu
Poda suau (ENG)
Poda suau (ENG)Poda suau (ENG)
Poda suau (ENG)
Associació AEI INNOVI
TT3161_Afonin
TT3161_AfoninTT3161_Afonin
TT3161_Afonin
Eugene Afonin
Pxgm 6102
Pxgm 6102Pxgm 6102
Pxgm 6102
Kogeela Selvi
Lisp
LispLisp
Lisp
Aniruddha Chakrabarti
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

Similar to Common Lisp как второй язык (20)

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Yandex
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
Vladimir Burdaev
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Daniel Podolsky
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Ontico
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
Roman Grebennikov
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
-Доминанта
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
ScalaNsk
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
Nikita Baksalyar
Языки программирования
Языки программированияЯзыки программирования
Языки программирования
paulsmirnov
javascript_part1
javascript_part1javascript_part1
javascript_part1
sovest
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
corehard_by
Александр Гладыш — Lua
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — Lua
Yury Yurevich
Отладка в 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
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в 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
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Yandex
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
Vladimir Burdaev
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Golang в действии: Как нам удается писать highload приложение на (не?)подходя...
Daniel Podolsky
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Ontico
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
Roman Grebennikov
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
-Доминанта
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
ScalaNsk
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
Nikita Baksalyar
Языки программирования
Языки программированияЯзыки программирования
Языки программирования
paulsmirnov
javascript_part1
javascript_part1javascript_part1
javascript_part1
sovest
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
corehard_by
Александр Гладыш — Lua
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — Lua
Yury Yurevich
Сравнение форматов и библиотек сериализации / Антон Рыжов (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
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в 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

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/