Оба (funcall (лямбда и (лямбда работала - PullRequest
0 голосов
/ 02 ноября 2019

Я читаю Simple-Lambda в elisp docs с примером

#+begin_src emacs-lisp :session sicp :lexical t
     (funcall (lambda (a b c) (+ a b c))
              1 (* 2 3) (- 5 4))
#+end_src

#+RESULTS:
: 8

ниже работает также

#+begin_src emacs-lisp :session sicp :lexical t
((lambda (a b c) (+ a b c))
 1 (* 2 3) (- 5 4))
#+end_src

#+RESULTS:
: 8

Это смутило меня, elispстиль lisp-2, поэтому при оценке (lambda (a b c) (+ a b c)) интерпретатор будет искать в ячейке блока для определения объекта, и, следовательно, демонстрация документа имеет смысл вызвать funcall

     (funcall (lambda (a b c) (+ a b c))
              1 (* 2 3) (- 5 4))

Тем не менее, он работает безfuncall?

((lambda (a b c) (+ a b c))
 1 (* 2 3) (- 5 4))

Кроме того, лямбда не имеет самооценочных форм

Обычно в Лисп-коде пишут числа, символы, строки и даже векторы, используя преимуществао том, что они самооценки.

1 Ответ

1 голос
/ 02 ноября 2019

В Elisp есть особый случай непосредственного вызова форм lambda.

((lambda ...) ...)

Как вы заметили, этот подход не работает в более общих случаях для других форм, возвращающих функции. Он также не рекомендуется для этого случая, когда он работает, поэтому лучше его вообще не использовать.

Этот синтаксис кратко описан в (elisp)Function Indirection:

в следующем примеревызывает функцию без какой-либо косвенной символьной функции, поскольку первый элемент - это анонимная функция Лиспа, а не символ.

((lambda (arg) (erste arg))
 '(1 2 3))
     ⇒ 1

При выполнении самой функции вычисляется ее тело;это вызывает косвенное обращение к символьным функциям при вызове 'erste'.

Эта форма используется редко и в настоящее время устарела. Вместо этого вы должны написать это как:

(funcall (lambda (arg) (erste arg))
         '(1 2 3))

или просто

(let ((arg '(1 2 3))) (erste arg))
...