Ответ в теме: Введение в Lisp

#4220

oldrat984
Участник

На самом деле в том топике всё неправильно:
как минимум:
во-первых: quote — не функция в терминалогии лиспа, а «специальная форма»,
во-вторых: лиспы отличаются между собой не только «структурой базовых функций», а порою много чем, например макро-системой, набором встроенных специальных форм, или «организацией» модульности, или, например, вообще синтаксисом (если взять например scheme, common lisp, clojure и emacs lisp, то у всех у них немножко отличается «reader» (в common lisp и в некоторых scheme-ах (по крайней мере в racket есть способ), он программируемый)), ну и: функциональность большинства диалектов лиспа под большим вопросом (например в common lisp половина функций не чистые, есть goto (причём и лексический, и динамический), есть присваивания (причём обобщённые), да и вообще side-эффекты вообщем-то никак не «локализуются» (в отличии от того же Haskell-я, например)).

Ну это я так для справки. (Конечно это всё очень сложно как-то описать в 10 предложениях, но в результате, то что написано в топике выглядит не правдой, и не очень убедительно).

P.S. пожалуй единственное, в чём проявляется «функциональность» лиспа (по крайней мере common lisp) это
первое: «first-class functions», и может быть то, что любое выражение, возвращает значение (на самом деле не совсем так) и второе: более менее «можно подставить что угодно куда угодно» в смысле нет деления на statement и expression,
так что можно написать например (+ (if nil 2 3) 4) и лисп вполне себе выдаст 7 несмотря на то, ‘+’ это обычная функция, а ‘if’ это специальная форма.

Причём конкретно в common lisp порядок вычисления аргументов функции вполне определён (слева на право), поэтому можно (хотя наверное не нужно) вообще писать аргументы с побочными эффектами.
Что-то типа: (let ((tmp 1)) (+ (incf tmp) tmp)) всегда будет выдавать 4.