我正在用一个例子阅读elisp文档中的简单-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是有意义的。
(funcall (lambda (a b c) (+ a b c))
1 (* 2 3) (- 5 4))尽管如此,它的工作没有功能?
((lambda (a b c) (+ a b c))
1 (* 2 3) (- 5 4))此外,lambda不是自我评估的形式。
在Lisp代码中编写数字、字符、字符串甚至向量是很常见的,利用它们自我评估的事实。
发布于 2019-11-02 08:17:55
Elisp对于直接调用lambda表单有一个特例。
((lambda ...) ...)正如您已经注意到的,这种方法在其他函数返回表单中不适用于更一般的情况。在这种情况下,它也是不可取的,所以最好不要使用它。
这个语法在(elisp)Function Indirection中有简要介绍。
下面的示例调用一个没有任何间接符号函数的函数,因为第一个元素是一个匿名Lisp函数,而不是一个符号。 ((lambda (arg) (erste arg))‘(12,3))⇒1 执行函数本身评估它的主体;在调用‘erste’时,这确实涉及符号函数间接性。 此表单很少使用,现在已不再推荐使用。相反,您应该将它写成: (funcall (lambda (arg) (erste arg))‘(12,3)) 或者只是 ((arg‘(12,3) (erste Arg)
https://stackoverflow.com/questions/58669345
复制相似问题