我正在用示例阅读elisp文档中的Simple-Lambda
#+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
< / p>
(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))
此外,lambda并非自我评估形式
通常写数字,字符,字符串甚至向量 在Lisp代码中,利用了他们自我评估的事实。
答案 0 :(得分:1)
Elisp的特殊情况是直接调用lambda
表单。
((lambda ...) ...)
您已经注意到,对于其他函数返回形式,这种方法在更一般的情况下不起作用。在确实可以正常工作的情况下,也不建议使用它,因此最好不要使用它。
(elisp)Function Indirection
中简要介绍了此语法:
下面的示例调用一个没有任何功能的函数 符号函数间接,因为第一个元素是匿名 Lisp函数,而不是符号。
((lambda (arg) (erste arg)) '(1 2 3)) ⇒ 1
执行功能本身会评估其主体;这确实涉及 调用“ erste”时符号函数间接调用。
此表格很少使用,现已弃用。相反,您应该 写为:
(funcall (lambda (arg) (erste arg)) '(1 2 3))
或者只是
(let ((arg '(1 2 3))) (erste arg))