Почему для определения функции LISP не требуется кавычка перед аргументом параметра? - PullRequest
13 голосов
/ 16 ноября 2010

Возьмем эту функцию:

(defun sum-greater (x y z)
 (> (+ x y) z))

Насколько я понимаю, в LISP первый элемент в списке всегда представляет функцию, которая будет выполняться для последующих атомов / списков.Так почему же LISP не обрабатывает x in (x y z) как функцию, выполняемую на y и z.Понятно, что это нежелательное поведение, но ожидаемое поведение.

Предположительно, функция, которая определяет defun, каким-то образом переопределяет стандартную оценку списка LISP?Если да, не могли бы вы рассказать об этом подробнее?

Спасибо

Ответы [ 5 ]

9 голосов
/ 16 ноября 2010

IIRC в Common Lisp, по крайней мере, defun - это макрос ( HyperSpec ), означающий, что он может определять любую стратегию оценки для своих аргументов.

6 голосов
/ 16 ноября 2010

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

Lisp HyperSpec (Common Lisp) говорит , и я цитирую: «Ни один из аргументов не оцениваетсяво время расширения макроса ".

3 голосов
/ 16 ноября 2010

Вы можете скачать здесь базовое введение в Лисп:

Common Lisp: Нежное введение в символические вычисления, Дэвид С. Турецкий .

Lisp и особенно Common Lisp имеет несколько форм Lisp:

  • вызовы функций

  • макро вызовы

  • специальные бланки

DEFUN - это макрос. Таким образом, макрос определяет, какие части оцениваются, а какие нет. Для ANSI Common Lisp это определено в стандарте и реализовано макросом DEFUN.

3 голосов
/ 16 ноября 2010

Ваше предположение верно.Defun обычно представляет собой специальную форму или макрос

2 голосов
/ 16 ноября 2010

defun - это не функция, а особая форма (или сводится к единице), и для них механизмы оценки различны.Подобные примеры были бы, если бы один из аргументов вообще отбрасывался без какой-либо оценки!

...