我正在尝试创建一个将返回一个常量值的函数.
在JavaScript和其他现代命令式语言中,我会使用闭包:
function id(a) {
return function() {return a;};
}
Run Code Online (Sandbox Code Playgroud)
但是Emacs lisp并不支持这些.
我可以创建身份功能和部分功能应用程序的混合,但它也不支持.
那我该怎么做?
我创建了一个在Elisp中返回函数的函数:
(defun singleton-set (elem)
(defun f (n) (= n elem))
f)
Run Code Online (Sandbox Code Playgroud)
我尝试在IELM中运行它,它失败了:
ELISP> (singleton-set 5)
*** Eval error *** Symbol's value as variable is void: f
ELISP> ((singleton-set 5) 5)
*** Eval error *** Invalid function: (singleton-set 5)
Run Code Online (Sandbox Code Playgroud)
由于Lisp-1和Lisp-2有什么区别?我将代码更改为
(defun singleton-set (elem)
(defun f (n) (= n elem))
#'f)
Run Code Online (Sandbox Code Playgroud)
并调用(funcall (singleton-set 5) 5),但现在错误是
*** Eval error *** Symbol's value as variable is void: elem
我从elisp了解到:从内部函数捕获变量,这是由于Emacs Lisp的动态绑定.
如何在Emacs Lisp中使函数返回函数?这种机制与Python,Scala或Clojure等其他语言有什么不同?
相关问题:
这与此问题有关: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)分别.