Синтаксис =>
, известный как функция стрелки, является относительно новой особенностью JavaScript. Вам понадобится аналогичная новая версия Node, чтобы воспользоваться ею.
Выражение LAMBDA
(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
LAMBDA - макрос. Он расширяет (lambda ...)
до (function (lambda ...))
, что эквивалентно #'(lambda ...))
.
CL-USER > (macroexpand '(lambda (foo) foo))
(FUNCTION (LAMBDA (FOO) FOO))
Макрос сохраняет вам немного записи / чтения, вот и все. В первой версии Common Lisp (CLtL1) макроса LAMBDA
не было. Он был добавлен позже и теперь является частью ANSI Common Lisp ,
Специальный оператор FUNCTION
FUNCTION является специальный оператор. Он ожидает имя функции или выражение лямбда . Таким образом, имя или лямбда-выражение не оцениваются. На самом деле лямбда-выражения вообще не могут быть оценены. Внутри FUNCTION
выражение лямбда не является макроскопической формой и, следовательно, не будет расширяться снова. Целью FUNCTION
является возврат соответствующего объекта функции, который обозначается именем или выражением лямбда . Он возвращает объект функции как значение. С помощью этого специального оператора можно получить доступ к функциональному объекту из глобальных функций и лексических функций.
Оператор FUNCTION
необходим в Common Lisp, поскольку он имеет отдельные пространства имен для значений, функций и некоторых других вещей. Это как так называемый Lisp-2 или даже Lisp-n с двумя или несколькими пространствами имен.
Лямбда-выражения в позиции функции в функции form
((lambda (foo) foo) 10)
поддерживается встроенным синтаксисом для Common Lisp. См. Лямбда-формы .
Сбивание с толку
Это все логично, но сбивает с толку. Не волнуйтесь, что вы не одиноки, но на практике это не так.