Найти в Дзене
Журнал «Код»

Что такое Lisp

Оглавление

Старый, но до сих пор нужный язык программирования

Когда мы рассказывали про функциональное программирование, то привели в пример несколько языков, которые подходят для этого лучше всего. В этом списке есть особенный язык — Lisp. Особенный он потому, что именно с него и началось всё функциональное программирование.

Что такое Lisp

Lisp — это язык программирования, который сейчас используется для обработки и анализа данных. Язык очень старый, но иногда используется и сейчас для узкоспециализированных задач типа машинного обучения.

Язык высокоуровневый, то есть код написан более-менее человеческим языком и поддерживает сложную логику и работу со строками и числами в привычном нам формате.

Что работает на Lisp

На Lisp написан софт, который мониторит состояние самолётов — например «Боингов» и «Эйрбасов». Также Lisp лежит в основе софта, который анализирует и распределяет ресурсы в лондонском метрополитене.

На Lisp работает система обработки данных Apache Storm, текстовый анализатор Grammarly. На этом же языке сделан Circle CI — система постоянной выкатки новых версий софта (CI/CD).

А ещё Lisp используется тут:

  • AutoCAD — язык использует внутренние команды для автоматического проектирования.
  • Emacs — многофункциональный текстовый редактор, в котором Lisp выступает и как язык, на котором написан сам Emacs, и как язык внутренней обработки текста.
  • Audacity — программы для работы со звуком.

На Lisp не пишут игры и приложения, это не язык для создания сложных экранных интерфейсов или быстрого прототипирования мобильных приложений.

Как и зачем появился Lisp

В 1950-х программисты и математики вплотную начали работать над искусственным интеллектом. Нейросети тогда были чисто математической моделью без практического применения, поэтому учёные взяли за основу такую идею:

Чтобы искусственный интеллект работал как настоящий, он должен быть устроен точно так же. А раз наш интеллект основан на мыслях, которые мы можем выразить словами, то нам нужно научить компьютер разбираться в словах, их смыслах и взаимосвязи между ними. Проще говоря, чтобы компьютер мог выразить свою мысль словами точно так же, как это делает человек.

Все наши мысли можно сформулировать в виде предложений, которые состоят из слов, а слова — из букв. Получается, что искусственный интеллект должен легко оперировать словами и символами и знать, в каком порядке их надо выстроить.

В то время ни один из существующих языков не позволял работать со строками и символами на таком уровне, поэтому Джон Маккарти в 1958 написал первую версию языка Lisp. Это название — сокращение от LISt Processing language, что переводится как «язык обработки списков». Списком может быть что угодно: символ, слово, предложение, другой список или даже список функций.

Пример кода

Чтобы сразу было понятно, чем этот язык отличается от других, вот два примера кода на Lisp. Первый обрабатывает два комплексных числа:

А вот код, который сам анализирует с точки зрения математики введённую строку и выполняет все математические операции:

Штука в том, что математических символов может быть сколько угодно и они могут стоять в любом порядке — Lisp их все найдёт, проанализирует, сам выстроит как нужно, посчитает и выдаст ответ. А всё потому, что этот язык изначально был заточен на обработку строк и символов.

Вот что получится, если запустить второй пример и попробовать вычислить несколько выражений:

(calcExpr "5+(7-4)*5")
==> 20
(calcExpr "(sin(1))^2+(cos(1))^2")
==> 1.000000000000000E+0

Особенности языка

Скобки и списки. Про скобки в Lisp есть тысячи мемов и шуток, а всё потому, что круглые скобки — это обозначение списка. В Lisp в списке может быть что угодно: другие команды, слова, символы, функции, списки в списках и так далее. И всё это может быть даже внутри одного списка, а потом передаваться в работу в качестве параметра в другой список.

-2
-3

Функции можно объявить где угодно. Действительно где угодно — даже в середине строки (которая в Lisp — тоже список, который будет обработан). Код из-за этого может стать менее читаемым, но если вы пишете на Lisp, то читаемость любого кода для вас вообще не проблема.

Создание своих правил. Главная задача языка Lisp — обработать ваши списки по вашим же правилам. Это самая суть функционального программирования: вы задаёте правила обработки, а язык сам разбирается, как и где их применить, куда передать результат и что с ним делать дальше.

В чём хорош Lisp

Суперсила классического Lisp — в его умении работать с текстом: разбирать его на составляющие, искать связи, делать выводы и всё такое. При этом текстом может быть что угодно:

  • обычный текст;
  • статьи и базы знаний;
  • код на других языках;
  • внутренние команды какой-то программы, например AutoCAD;
  • команды для станков;
  • управляющая последовательность байтов на сервере;
  • база данных.

Сейчас чаще используют Common Lisp — потомок оригинального языка, в который добавили новые команды, структуры данных и возможности для императивного программирования. Common Lisp можно применять везде, где есть правила обработки данных — от медицины и работы над геномом человека до внутренних систем передачи данных внутри интернет-провайдера.