如何在elisp中返回函数

RNA*_*RNA 2 lisp elisp return function

这与此问题有关:elisp用作参数和返回值

(defun avg-damp (n)
   '(lambda(x) (/ n 2.0)))
Run Code Online (Sandbox Code Playgroud)

(funcall (avg-damp 6) 10)
Run Code Online (Sandbox Code Playgroud)

要么

((avg-damp 6) 10)
Run Code Online (Sandbox Code Playgroud)

他们给的错误Symbol's value as variable is void: n,并eval: Invalid function: (avg-damp 6)分别.

sds*_*sds 6

第一种形式不起作用的原因n是动态绑定,而不是词法:

(defun avg-damp (n)
  (lexical-let ((n n))
    (lambda(x) (/ x n))))
(funcall (avg-damp 3) 12)
==> 4
Run Code Online (Sandbox Code Playgroud)

第二种形式不起作用的原因是Emacs Lisp和Common Lisp一样,是"lisp-2",而不是"lisp-1"

  • @JoshuaTaylor`((lambda(...)...)...)`是Cl中的一个特例.通常,每当评估一个函数时,你得到的值是"绑定"(well,value),但是`(lambda(...)...)`***只有一个函数"value"而不是一般值,所以它是明确允许的. (3认同)
  • 请注意:lisp-1和lisp-2之间的区别在于符号是仅具有值绑定(lisp-1)还是值绑定和函数绑定.lisp-2仍然可以有一个评估语义,表示"评估(f a1 a2 ...),如果f是符号,则将其函数绑定应用于a1 a2 ...",否则如果f是复合形式,则对其进行评估并应用结果为a1 a2 ......".在Common Lisp中我们已经可以做((lambda(x)(list xx))4)和get(4 4).我认为支持((...)...)的lisp仍然可以是lisp-2,只要(f ...)只应用f的函数绑定,而不是值绑定. (2认同)