В Common Lisp LAMBDA
- это две разные вещи: макрос и символ, которые можно использовать в выражении LAMBDA.
Выражение LAMBDA:
(function (lambda (x) (foo x)))
короче написано как
#'(lambda (x) (foo x))
Применяется также лямбда-выражение:
((lambda (x) (+ x x)) 4)
Выше обе формы являются частью основного синтаксиса Common Lisp.
Позднее в определении Common Lisp был добавлен макрос с именем LAMBDA
. Достаточно запутанно, но с добрыми намерениями. ;-) Это задокументировано как Макро LAMBDA .
(lambda (x) (+ x x))
расширяется до
(function (lambda (x) (+ x x))
Это делает код Common Lisp немного похожим на код Scheme, и тогда нет необходимости писать
(mapcar #'(lambda (x) (+ x x)) some-list)
С помощью макроса LAMBDA
мы можем написать
(mapcar (lambda (x) (+ x x)) some-list)
Ваш пример терпит неудачу, потому что
((my-lambda (x) (* x x)) 2)
недопустим синтаксис Common Lisp.
Common 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)
Пример: * 1 069 *
CL-USER 1 > ((λ (x) (* x x)) 3)
9
CL-USER 2 > '(λ (x) (* x x))
(LAMBDA (X) (* X X))