Взято из Practical Common Lisp, Глава 5 :
Один из способов думать о выражениях LAMBDA - это особый вид имени функции, где само имя напрямую описывает то, что функция делает. Это объясняет, почему вы можете использовать выражение LAMBDA вместо имени функции с # '.
(funcall #'(lambda (x y) (+ x y)) 2 3) ==> 5
Вы даже можете использовать выражение LAMBDA в качестве «имени» функции в выражении вызова функции. Если вы хотите, вы можете написать предыдущее выражение FUNCALL более кратким.
((lambda (x y) (+ x y)) 2 3) ==> 5
Но это почти никогда не делается; Стоит только отметить, что это законно, чтобы подчеркнуть, что выражения LAMBDA могут использоваться везде, где может быть нормальное имя функции.
blockquote>Что касается вашего вопроса:
Является ли LAMBDA особым исключением из правила с жесткой установкой, что первый элемент вычисляемого выражения должен быть именем некоторой операции, или есть какой-то более последовательный набор правил, который я неправильно понимаю?
blockquote>
Технически нет , потому что лямбда-выражения являются юридической функцией Имена . strike>Редактировать : Лямбда-выражения - это , а не имена функций, но вы можете рассматривать их как имена функций, где «само имя» непосредственно описывает, что делает функция. "
Также см. Почему # используется перед лямбда-выражением в Common Lisp?
Причина, по которой
(#'f 12)
не работает, заключается в том, что
- вы сохранили функцию в ячейке значения символа f, а
- читатель ожидает символ со значением в своей ячейке функции, который
#'f
не является [ 1110]
quote
оператор (для которого апостроф является синтаксическим сахаром) означает, что его аргументы не оценены, т.е. (quote (str1 str2))
возвращает список двух символов. Использовать list
вместо этого: (list str1 str2)
.
Создайте список значений:
(defun test ()
(let ((str1 "foo") (str2 "bar"))
(loop for s in (list str1 str2) do (message s))))