首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elisp中的高阶函数

Elisp中的高阶函数
EN

Stack Overflow用户
提问于 2012-10-07 20:16:56
回答 3查看 1.8K关注 0票数 10

我创建了一个函数,它在Elisp中返回一个函数:

代码语言:javascript
复制
(defun singleton-set (elem)
  (defun f (n) (= n elem))
  f)

我试着在IELM中运行它,但是失败了:

代码语言:javascript
复制
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有什么区别?,我将代码更改为

代码语言:javascript
复制
(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等其他语言不同的原因是什么?

相关问题:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-07 20:55:46

来自Emacs 24的NEWS

Emacs 24.1的Lisp变化

  • 现在,代码可以在默认情况下使用词法作用域而不是动态作用域。lexical-binding变量启用局部变量的词法作用域。它通常是通过文件的第一行中的文件局部变量来设置的,在这种情况下,它适用于该文件中的所有代码。

所以,在Emacs 24:

代码语言:javascript
复制
(setq lexical-binding t)
(defun singleton-set (elem) (lambda (n) (= n elem)))
(mapcar (singleton-set 1) '(0 1 2 3))
    ===> (nil t nil nil)
票数 11
EN

Stack Overflow用户

发布于 2012-10-07 20:32:44

如何使Emacs中的函数返回函数成为可能?

使用假闭包lexical-let

这种机制与Python、Scala或Clojure等其他语言不同的原因是什么?

理查德·斯塔尔曼( Richard )在不久前写的一篇论文中写道。

票数 6
EN

Stack Overflow用户

发布于 2012-10-07 20:30:16

代码语言:javascript
复制
(defun singleton-set (elem)
  `(lambda (n) (= n ,elem))

请参阅:作为参数和返回值的elisp函数

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12772510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档