Если действительные формы должны начинаться с символа, чем то, что есть ((lambda (a) (+ 1 a)) 1) [duplicate]

Синтаксис =>, известный как функция стрелки, является относительно новой особенностью JavaScript. Вам понадобится аналогичная новая версия Node, чтобы воспользоваться ею.

14
задан nrz 10 November 2012 в 12:12
поделиться

1 ответ

Выражение 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. См. Лямбда-формы .

Сбивание с толку

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

19
ответ дан Rainer Joswig 28 August 2018 в 02:39
поделиться
Другие вопросы по тегам:

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