Итак, допустим, я хочу вызвать некоторую функцию. Если я определил функцию с помощью defun, я просто использую имя функции в начале списка, за которым следуют ее аргументы, например так (я буду использовать «=>» в примерах, чтобы показать вывод ввода кода в ответный ответ):
(defun f (a) (lambda (b) (+ a b))) => F
(f 12) => #<FUNCTION :LAMBDA (B) (+ A B)>
Достаточно просто. Первым элементом списка должно быть имя функции, специального оператора или макроса. Кроме того, действует также следующее:
((lambda (a) (+ a 12)) 1) => 13
Быстрый поиск в Google показывает, что LAMBDA - это и символ, и макрос. Попытка расширить макрос дает:
(macroexpand '(lambda (a) (+ a 12))) => #'(LAMBDA (A) (+ A 12))
Это не полезно. У меня нет возможности провести различие между макросом LAMBDA и символом LAMBDA, и мне совершенно неясно, почему я могу использовать лямбда-выражение в качестве имени функции, но не, скажем, # 'f, что, насколько мне известно, следует оценить действительное обозначение функции для функции F так же, как # '(LAMBDA (A) (+ A 12)), и все же:
(#'f 12) => *** - EVAL: #'F is not a function name; try using a symbol instead
Является ли LAMBDA особым исключением из жестко заданного правила, согласно которому первый элемент оцениваемого выражения должен быть именем какой-либо операции, или существует более последовательный набор правил, который я неправильно понимаю?