Он выглядит пугающе, но считается одним из самых влиятельных в истории программирования — язык Lisp. Где его используют и как научиться не думать о строчках — в этой статье.
История Lisp
Язык Lisp создал в 1958 году математик Джон Маккарти для исследований в области искусственного интеллекта. Со временем его революционные концепции повлияли на другие языки программирования.
Именно в Lisp впервые появились:
- garbage collection — автоматическая очистка памяти;
- REPL — интерактивная среда, где можно выполнять код по строчке и сразу видеть результат;
- функциональное программирование — подход, при котором вычисления рассматриваются как оценка математических функций.
Половина того, что сегодня считается современным языком, было придумано в эпоху Lisp.
Особенности языка
Lisp отличается от большинства привычных языков программирования:
- Списки как основная структура данных. Программы на Лисп — это вложенные списки, которые можно легко обработать как данные.
- Гомоиконичный язык. У кода и данных одинаковая структура. На Лисп можно писать программы, которые изменяют или генерируют код во время выполнения.
- Динамически типизированный язык. Типы переменных определяются во время выполнения, а не во время компиляции. Это делает код гибким.
- Многопоточность и параллелизм позволяют писать высокопроизводительные приложения.
- Собственная библиотека. Есть функции для работы с данными, математическими вычислениями. Разработчики могут создавать сложные приложения и не писать код с нуля.

Где используют Lisp
Несмотря на «возраст», язык Lisp все еще активно применяют. Его используют:
- в искусственном интеллекте для создания нейросетей. Lisp позволяет легко манипулировать данными и логическими выводами;
- научных исследованиях и вычислениях. Например, для разработки алгоритмов и решения математических задач;
- разработке ПО для написания скриптов и автоматизации рутины;
- образовании как пример для изучения компиляции и интерпретации языков программирования;
- разработке игр для создания игровых движков и скриптов. Можно быстро реализовывать идеи и тестировать их без необходимости писать много кода;
- веб-разработке для создания серверной части приложений и интерактивных веб-приложений.
Основы синтаксиса
Язык Lisp отличается от других языков программирования необычным синтаксисом:
- Списки являются основным строительным блоком. Они заключаются в круглые скобки и могут содержать любое количество элементов, включая другие списки.
lisp (define my-list '(1 2 3 4))
Определяем список my-list, который содержит четыре элемента: 1, 2, 3, 4.
- Операторы и функции. Если в большинстве языков арифметика записывается последовательно, то в Лисп сначала пишется оператор, а потом аргументы.
lisp (* 3 4)
Умножаем 3 на 4 и возвращаем результат 12.
- Определение функций. Можно определять свои собственные функции с помощью специальной формы defun.
lisp (defun square (x) (* x x))
Функция square принимает один аргумент x и возвращает его квадрат.
- Циклы и итерации. Для выполнения повторяющихся действий используются конструкции loop, dotimes и др.
lisp (dotimes (i 5) (format t "Итерация: ~A~%" i))
Код выводит номер каждой итерации от 0 до 4.
- Работа с переменными. Можно определять переменные с помощью формы defvar или setq.
lisp (defvar my-var 10) (setq my-var 20)
Сначала определяем переменную my-var со значением 10, а затем меняем ее значение на 20.

Диалекты
Сегодня существует больше 20 разных диалектов Lisp. Самые популярные:
- Common Lisp. Индустриальный язык со множеством библиотек. Поддерживает функциональное, объектно-ориентированное и процедурное программирование.
- Scheme. Минималистичный диалект, разработанный в 1970-х годах. Отличается упрощенным синтаксисом, подходит для обучения.
- Clojure. Современный Lisp для JVM, создан в 2007 году. Ориентирован на функциональное программирование и работает на платформе Java.
Макросы
Lisp известен мощной системой макросов. Они преобразуют код до выполнения.
В отличие от обычных функций, которые принимают аргументы и возвращают значения, макросы работают с кодом как с данными. Их используют:
- для расширения языка, чтобы создавать новые конструкции, которые могут сделать код более читаемым и выразительным;
- снижения дублирования кода, чтобы избежать повтора часто используемых шаблонов кода;
- оптимизации, чтобы выполнять вычисления на этапе компиляции.
Важно помнить, что макросы могут затруднить чтение кода. Поэтому, если задачу можно решить с помощью обычной функции, лучше использовать ее.
Преимущества и недостатки Lisp
Главные плюсы
- Простой синтаксис. Весь код — это списки. Нет сложных синтаксических конструкций и запутанных исключений.
- Гомоиконичность. Можно генерировать код, трансформировать его, писать собственные языковые конструкции. Из-за гибкости Lisp часто называют языком программирования для хакеров. Задачи, которые требовали бы длинного кода в Python, в Lisp можно решить за десять строк.
- Сильные макросы. Расширяют язык, как будто вы сами проектируете его синтаксис.
Минусы
- Высокий порог входа. Непривычный синтаксис требует перестройки и адаптации.
- Небольшая экосистема. Есть собственные библиотеки и фреймворки, но выбора меньше, чем у Python или JavaScript.
- Небольшое сообщество. В интернете меньше статей и готовых решений, труднее находить ответы на спорные вопросы.
Lisp — не самый популярный, но важный для программистов язык. В рейтинге TIOBE он находится на 24 месте — между Classic Visual Basic и COBOL.

Главное о Lisp
- Lisp создали в 1958 году для работы с искусственным интеллектом.
- У Lisp необычный синтаксис. Он использует списки как основную структуру данных.
- С помощью макросов можно создавать собственный язык внутри языка.
- У Lisp несколько диалектов: Scheme подходит для обучения, Common Lisp — для разработки.
- Lisp не очень популярен, но используется в разных сферах: ИИ, научных исследованиях, разработке ПО, веб-приложений.

