Как стать автором
Обновить

Комментарии 8

Перевод машинный?

В качестве альтернативы существуют онлайн-реализации, однако они
являются компиляторами и работают не так, как локально установленная
версия Clisp.

Получается, что компилятор на локальной машине уже компилятором не является.

Clisp, к примеру, интерпретатор.

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

Когда уже заканчивал обучение в свом ВУЗе откры для себя Lisp и Prolog и немного влип в декларативные концепции.... так влип, что даже темой дипломной работы выбрал LISP - написал трансятор, а сокурсник засунул его в IDE (в модную в середине 90-х IDE от Borland - уже наверное сейчас никто и не помнит эту компанию).... Так потом в учебном процессе еще несколько лет наш а-ля-"BorlandLISP" вполне успешно успешно окунал новые поколения инжинеров в мир декларативных языков.

Почему не помнит? Borland был крутой компанией с свое время (Pascal, C, ASM компиляторы). Borland Pascal (а сперва Turbo Pascal от Borland) - я на этом вырос, диплом защищал и дальше использовал. А IDE был какой - прорывный и крутой по тем временам

Ну, LISP жив ещё, например, в Clojure, и имеет там свою аудиторию.

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

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

Лисп-программа сама является данными. И интерпретатор занимается преобразованием этих данных. Часть функций лиспа являются не функциями в традиционном смысле, а макросами - функциями над кодом. Тот же defun - это макрос, который принимает на вход имя, список имён и синтаксическое дерево кода. setq - это макрос, который принимает на вход имя и немедленно вычисляемое дерево кода. if - это макрос, который принимает три синтаксических дерева, вычисляет одно и затем вычисляет другое или третье.

Хотите новую фичу - просто напишите новый макрос. Красота!

И кстати, проблемы, на которые налетели пользователи лиспа, заставили людей очень крепко задуматься о правилах связывания имён. call-by-value, call-by-reference, call-by-name наконец. В чистом лямбда-исчислении такого нет, там все имена локальны. (И поэтому в лямбда-исчислении нет рекурсии без трюка с комбинатором Y). В лиспе же рекурсия - это следствие упущения: defun вводит новое имя со значением "функция", но не смотрит на код - лишь бы он был синтаксически правильным, то есть, чтобы скобочки сошлись. А какие имена там внутри упоминаются и что означают - это уже никого не волнует. Когда впоследствии код наткнётся на имя функции, он найдёт его в реестре функций и выполнит как функцию.

Труъ императивщина, на самом деле. На ходу менять реестры переменных и функций.

В следующих диалектах лиспа пришлось много внимания уделять этому вопросу.

Вы сразу узнаете ключевую характеристику кода LISP и поймете, почему в качестве возможного альтернативной расшифровки аббревиатуры было предложено Lots of Irritating Superfluous Parentheses (Много раздражающих лишних круглых скобок)

"Хакерам удалось украсть последние 50 МБ исходного кода программы на Lisp, которая управляет запуском баллистических ракет США.К счастью, там были только закрывающие скобки" (Ц).

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории