Ответ 1
В Common Lisp LAMBDA
есть две разные вещи: макрос и символ, который может использоваться в выражении LAMBDA.
Выражение LAMBDA:
(function (lambda (x) (foo x)))
короче написано как
#'(lambda (x) (foo x))
Применяется также lambda выражение:
((lambda (x) (+ x x)) 4)
Выше обе формы являются частью основного синтаксиса Common Lisp.
Позднее в определении Common Lisp добавлен макрос с именем LAMBDA
. Достаточно смешно, но с благими намерениями.;-) Это задокументировано как Macro LAMBDA.
(lambda (x) (+ x x))
расширяется в
(function (lambda (x) (+ x x))
Это делает код Common Lisp немного похож на код схемы, и тогда нет необходимости писать
(mapcar #'(lambda (x) (+ x x)) some-list)
С макросом LAMBDA
мы можем написать
(mapcar (lambda (x) (+ x x)) some-list)
Ваш пример не работает, потому что
((my-lambda (x) (* x x)) 2)
недействителен. Общий синтаксис Lisp.
Общий Lisp ожидает либо
- объект данных
- переменная
- вызов функции в форме
(function args...)
- вызов функции в форме
((lambda (arglist ...) body) args...)
- макроформа, подобная
(macro-name forms...)
- специальную форму с использованием одного из встроенных специальных операторов, таких как
FUNCTION
,LET
,... определенном в списке специальных операторов в Common Lisp
Как вы можете видеть синтаксис
((macro-name forms...) forms...)
не является частью Common Lisp.
Можно прочитать символ λ
как LAMBDA
:
(defun λ-reader (stream char)
(declare (ignore char stream))
'LAMBDA)
(set-macro-character #\λ #'λ-reader)
Пример:
CL-USER 1 > ((λ (x) (* x x)) 3)
9
CL-USER 2 > '(λ (x) (* x x))
(LAMBDA (X) (* X X))