Цикл по переменным в Lisp

Взято из 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]

5
задан Peter Mortensen 14 September 2010 в 20:36
поделиться

3 ответа

quote оператор (для которого апостроф является синтаксическим сахаром) означает, что его аргументы не оценены, т.е. (quote (str1 str2)) возвращает список двух символов. Использовать list вместо этого: (list str1 str2).

16
ответ дан 18 December 2019 в 06:23
поделиться

Создайте список значений:

(defun test ()
  (let ((str1 "foo") (str2 "bar"))
    (loop for s in (list str1 str2) do (message s))))
6
ответ дан 18 December 2019 в 06:23
поделиться

попытка:

`(,str1 ,str2)
3
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: