我创建了一个函数,它在Elisp中返回一个函数:
(defun singleton-set (elem)
(defun f (n) (= n elem))
f)我试着在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)由于Lisp-1和Lisp-2有什么区别?,我将代码更改为
(defun singleton-set (elem)
(defun f (n) (= n elem))
#'f)以及对(funcall (singleton-set 5) 5)的调用,但现在错误是
*** Eval error *** Symbol's value as variable is void: elem
我从elisp:从内部函数捕获变量了解到,这是由于Emacs的动态绑定。
如何使Emacs中的函数返回函数成为可能?这种机制与Python、Scala或Clojure等其他语言不同的原因是什么?
相关问题:
发布于 2012-10-07 20:55:46
来自Emacs 24的NEWS:
Emacs 24.1的Lisp变化
lexical-binding变量启用局部变量的词法作用域。它通常是通过文件的第一行中的文件局部变量来设置的,在这种情况下,它适用于该文件中的所有代码。所以,在Emacs 24:
(setq lexical-binding t)
(defun singleton-set (elem) (lambda (n) (= n elem)))
(mapcar (singleton-set 1) '(0 1 2 3))
===> (nil t nil nil)发布于 2012-10-07 20:32:44
如何使Emacs中的函数返回函数成为可能?
使用假闭包和lexical-let。
这种机制与Python、Scala或Clojure等其他语言不同的原因是什么?
理查德·斯塔尔曼( Richard )在不久前写的一篇论文中写道。
发布于 2012-10-07 20:30:16
(defun singleton-set (elem)
`(lambda (n) (= n ,elem))请参阅:作为参数和返回值的elisp函数
https://stackoverflow.com/questions/12772510
复制相似问题