相关疑难解决方法(0)

如何在Emacs Lisp中关闭?

我正在尝试创建一个将返回一个常量值的函数.

在JavaScript和其他现代命令式语言中,我会使用闭包:

function id(a) {
    return function() {return a;};
}
Run Code Online (Sandbox Code Playgroud)

但是Emacs lisp并不支持这些.

我可以创建身份功能和部分功能应用程序的混合,但它也不支持.

那我该怎么做?

emacs closures elisp

26
推荐指数
5
解决办法
5587
查看次数

Elisp中的高阶函数

我创建了一个在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等其他语言有什么不同?

相关问题:

emacs elisp dynamic-binding higher-order-functions

9
推荐指数
2
解决办法
1317
查看次数

如何在elisp中返回函数

这与此问题有关: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)分别.

lisp elisp return function

2
推荐指数
1
解决办法
1338
查看次数