Написание лямбда-выражений в 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. См.Лямда-Форм.
заблуждение
это все логично, но смущает. Не волнуйтесь, вы не одиноки, но на практике это не имеет большого значения.