Написание лямбда-выражений в common lisp

в настоящее время я читаю ANSI Common Lisp Пола Грэма, и у меня есть вопрос о написании лямбда-выражений.

нам нужно префикс лямбда-выражения с #'?. Если я напишу что-то подобное в REPL, он будет работать нормально

> ((lambda (x) (+ x 1)) 1)
  2

этот

> (mapcar (lambda (x) (+ x x)) '(1 2 3 4))
  (2 4 6 8)

Я понимаю, что #' обозначает функцию. Итак, мой вопрос: это какая-то конвенция или рекомендуемая практика? Может ли что-то пойти не так, если я не префикс lambdas с #', это зависит от реализации?

1 ответов


лямбда-выражение

(lambda ...) считается лямбда-выражение только в определенных местах, как function форма или как руководитель вызова функции. Лямбда-выражения не вычисляются.

(function              ; special operator FUNCTION
  (lambda () 'foobar)) ; <- this is a lambda expression


(                    ; a function call
 (lambda (foo) foo)  ; <- this is a lambda expression
 'bar                ; argument
)

а вот (lambda ...) является формой макроса, а не лямбда-выражением:

(funcall             ; calling a function via funcall
 (lambda (foo) foo)  ; this is not a lambda expressions, but the macro lambda
                     ;  as all arguments to FUNCALL it will be
                     ;    macro expanded and evaluated
                     ;  it expands to (function (lambda (foo) foo))
 'bar)               ; argument

лямбда макрос

лямда - макрос. Он расширяется (lambda ...) в (function (lambda ...)), что эквивалентно #'(lambda ...)).

CL-USER > (macroexpand '(lambda (foo) foo))
(FUNCTION (LAMBDA (FOO) FOO))

макрос экономит вам немного записи / чтения, вот и все. В первой версии Common Lisp (CLtL1) не было LAMBDA макрос. Он был добавлен позже и теперь является частью ANSI Common Lisp,

специальный оператор функции

функции специальный оператор. Он ожидает имя функции или лямбда-выражение. Таким образом имя или лямбда-выражение не оцениваются. На самом деле лямбда-выражения невозможно оценить вообще. Внутри FUNCTION, the лямбда-выражение и не макроформа и таким образом будет не снова расширилась. Цель FUNCTION - вернуть соответствующий объект функции, который обозначается именем или лямбда-выражение. Возвращает объект function в качестве значения. С этим специальный оператор можно получить доступ к объекту функции из глобальных функций и лексических функций.

на FUNCTION оператор необходим в Common Lisp, потому что он имеет отдельные пространства имен для значений, функций и нескольких других вещей. Это как так называемый Лисп-2 или даже Лисп-Н, С двумя или более пространствами имен.

лямбда-выражения в позиции функции в форме функции

((lambda (foo) foo) 10) поддерживается встроенный синтаксис для Common Lisp. См.Лямда-Форм.

заблуждение

это все логично, но смущает. Не волнуйтесь, вы не одиноки, но на практике это не имеет большого значения.