两者(funcall(lambda和(lambda

时间:2019-11-02 08:10:57

标签: elisp

我正在用示例阅读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代码中,利用了他们自我评估的事实。

1 个答案:

答案 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))