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

Психологический эффект, который это оказывает на вас, мало чем отличается от сцены в конце матрицы, где Нео смотрит в коридор, и его восприятие того, с чем он взаимодействует все это время, кардинально меняется. Он больше не пишет код, то есть строки текста. Он взаимодействует с самой структурой самих программ и воспринимает их.
Забавно то, что они всегда говорят, что они Нео в матрице, что, как я понимаю, круче, отчасти потому, что эта финальная сцена отражает феномен того, на что это похоже, но это, возможно, резюмируется более вялым образом: персонаж Сайфер в одной из своих цитат из того же фильма: «Но к этому привыкаешь. Ваш мозг переводит. Я даже не вижу кода. Я вижу только блондинку, брюнетку, рыжую. Эй, хочешь выпить? (кредиты ACow_Adonis на Hacker News)
Ниже приведен измененный отрывок из моего свободно доступного руководства по примерам Common Lisp, доступного на GitHub (щелкните здесь).
Лисп, первый язык ИИ:
Lisp был изобретен в 1958 году Джоном Маккарти, отцом искусственного интеллекта в Массачусетском технологическом институте, и развивался в лабораториях ИИ Стэнфорда и Массачусетского технологического института (среди прочих) в течение следующих 20 лет. Это второй старейший язык программирования, активно используемый после FORTRAN, и первый в мире функциональный язык программирования. Функциональное программирование сегодня в моде, но ни один из сегодняшних языков даже близко не сравнится с мощью Lisp.

На самом базовом уровне язык программирования - это набор правил (синтаксиса) для преобразования текста в машинный код. Исходный код хранится в виде строк на большинстве текстовых языков программирования и должен анализироваться компилятором в соответствии с правилами синтаксиса языка. Это не относится к Лиспу, который выражает исходные коды в примитивной структуре данных, известной как списки, которые могут быть непосредственно оценены компилятором или интерпретатором Лиспа.

Это оказывает глубокое влияние на использование Lisp и преимущества, которые он дает его пользователям. Код на Лиспе - это первоклассный объект данных на языке, которым можно манипулировать так же, как и любой другой структурой данных, например, динамически создаваемую, уничтожаемую, передаем в функцию, возвращаем как значение и обладаем всеми правами. что есть у других переменных в языке программирования. Это позволяет нам писать программы, которые могут генерировать исходный код и манипулировать им так же, как и любой другой объект данных.
В этом смысле мы говорим, что программы на Лиспе могут писать свои собственные программы, и это действительно замечательный результат, напоминающий новый рубеж автоматизации.
Знакомство с Lisp:
Далее мы кратко рассмотрим основы Lisp. Надеюсь, он смачивает ваши ноги и дает толчок вашему путешествию, ставя вас на путь к тому, чтобы стать опытным и эффективным в том, что я и многие другие считаю одним из самых красивых и элегантных языков на сегодняшний день.

Lisp - это интерактивный язык, и все системы Lisp будут включать интерактивный интерфейс, известный как верхний уровень. Мы можем ввести выражения Лиспа на верхний уровень, и Лисп будет их оценивать и печатать их значения. Это называется циклом чтения-оценки-печати или сокращенно REPL. Выражения Лиспа, которые должны быть вычислены, известны как формы.
Атомы - это основная единица Лиспа, представляющая отдельные объекты, такие как число 5 и строка «Hello, World!». Списки - это совокупность атомов или других списков, разделенных пробелом и заключенных в круглые скобки, например (1 2 3) или (“Michael” “David” “Ben”). Примером вложенного списка может быть ((1 2 3) 4 5 6). Наконец, Lisp использует префиксную нотацию по всему языку, то есть операторы предшествуют своим аргументам. Например, мы бы вычислили 2 + 3 как (+ 2 3).
Оценка форм
Lisp применяет последовательный набор правил оценки для атомарных форм и форм списков. Атомы оцените сами. Например, число 8, появляющееся как атом в коде Lisp, будет оцениваться как 8, а строка “Color is gold” будет оцениваться как само себя. Обратите внимание, что списки сами по себе представляют собой набор атомов; при оценке списка нам необходимо оценить каждый из атомов индивидуально, а затем применить правила оценки списка.
Lisp оценивает список, просматривая его первый элемент и определяя, представляет ли он начало одного из четырех типов форм: функции, специальной, макросной или лямбда-выражения. Остальные элементы списка передаются в качестве аргументов блоку кода, названному первым элементом списка:

Список, первым элементом которого является символ имени функции, известен как форма функции. Lisp оценит оставшиеся элементы функциональной формы и передаст их в качестве аргументов функции, связанной с символом (т.е. названной им). Например, приведенная ниже форма оценивает аргументы для 10, 5 и 15 соответственно (каждый сам является результатом функции) и передает их в вызов функции для возврата 30:
(+ (+ 5 5) (* 5 1) (+ 10 5)) ; Returns 30
Правило оценки для функций (чтобы оценить все аргументы и передать их функции, названной первым элементом) не подходит для всех сценариев. Например, в условном выражении IF мы хотим, чтобы выражение true выполнялось только в том случае, если условие истинно, и мы хотим, чтобы выражение false оценивалось только в том случае, если условие ложно.
Ниже мы хотим разделить 10 на значение, хранящееся в X, только если оно не равно нулю (иначе мы получим ошибку деления на ноль). В IF условном выражении и во многих других языковых конструкциях мы не хотим, чтобы каждый элемент списка оценивался.
(defparameter x 0)
(if (zerop X) ; Test if x = 0
“Cannot divide as X is zero” ; Do this if x = 0
(/ 10 X)) ; Do this if x not 0
Действительно, в Лиспе есть особые правила оценки для функций, специальных форм, лямбда-форм и макросов. Однако основной принцип тот же - Lisp будет искать первый элемент каждого списка, а затем применять соответствующее правило оценки, используя оставшиеся элементы в качестве аргументов вызываемой языковой конструкции.
Теперь попробуйте ввести следующий список в наш верхний уровень. Вы получите сообщение об ошибке. Это потому, что Lisp будет смотреть на первый элемент 1 и не может его оценить, поскольку 1 - это число, а не имя функции, специальной формы или макроса.
(1 2 3) ; Error as 1 is not a function or a name for another code block (special form, lambda form, macro form)
Продолжить чтение
Вышеупомянутое - это всего лишь беглый взгляд на Лисп, взятый из моего краткого 52-страничного руководства «Common Lisp by Example». Вы можете бесплатно получить копию моего руководства на GitHub по следующей ссылке. Если вам это нравится, пометьте его на GitHub:
Если я могу попросить вас сегодня об одном, это посвятить 10 часов изучению Лиспа; немного поработать сейчас, и мы надеемся, что откроет вам мир новых возможностей в программировании в будущем. Лисп - красивый симметричный язык, очень мощный и элегантный. Многие концепции, используемые сегодня в других языках, произошли от Лиспа. Потратить немного времени на изучение Лиспа не так уж и много, и, надеюсь, это принесет вам значительную пользу.
Как и все в жизни, нам нужно работать, чтобы получить результаты, и я не буду недооценивать усилия, необходимые для знакомства с Лиспом. Однако я действительно считаю, что оно того стоит.
…и наконец
Самый простой способ установить и начать писать код на Common Lisp - через бесплатное приложение Portacle. Теперь никаких оправданий!

