function - Emacs Lisp 可以将 lambda 形式分配给 Scheme 之类的变量吗?

标签 function lambda scheme elisp lisp-2

在调查 Emacs Lisp 的符号单元时,我发现对于一个示例函数,如

(defun a (&rest x)
    x)

我可以调用 (symbol-function 'a),它返回 (lambda (&rest x) x)。如果需要,我可以使用它

> ((lambda (&rest x) x) 1 2 3 4 5)
(1 2 3 4 5)

与上面的原始函数具有相同的功能。现在,这让我想起了 Scheme,其中 lambda 表达式是函数的主体,并使用 Scheme 的通用 define 分配给变量名。例如

(define atom?
    (lambda (x)
        (and (not (pair? x)) (not (null? x)))))

只是将 lambda 表达式分配给 atom? —— 现在 atom? 是一个函数。那么 elisp 可以做到这一点吗,即将一个 lambda 表达式分配给一个符号,然后将它用作一个函数?我试过了

(setq new-a (lambda (&rest x) x))

如果我尝试将它用作函数,它会给出 (void-function new-a)。有没有办法在这个问题上模仿Scheme世界?看来一定是有办法的。如果我们不能将此 lambda 表达式转换为函数,为什么 a 的函数单元会包含 (lambda (&rest x) x)

最佳答案

scheme 和 emacs lisp(以及大多数其他 lisp)之间的一个重要区别是 scheme 有一个单一的命名空间,而 emacs lisp 有单独的函数和变量命名空间。被评估的列表形式中的第一个位置命名一个函数,并且该名称在函数 namespace 中查找。在 scheme 中,所有名称都位于同一空间中,绑定(bind)到名称的值会在出现的任何地方被查找和使用。

这意味着在 emacs lisp 中你可以这样:

(defun f (x) (+ x x))
(setq f 2)
(f f) ;=> 4

这在 scheme 中是不可能的,这里只有一个 f,如果你设置它的值,它会从(比如说)一个函数变成一个数字。

在 emacs lisp 中有不同的处理方式。

一种是使用funcallapply 等函数,它们接受一个函数和一些参数并将函数应用于参数,如:

(setq f (lambda (x) (+ x x)))
(funcall f 2) ;=> 4

另一种方法是操纵函数名称f 的含义。有一个名为 fset 的函数允许您将函数附加到名称(在函数命名空间中):

(fset 'f (lambda (x) (+ x x x)))
(f 2) ;=> 6

请注意,fset 作用于名称(又名符号),因此需要引用名称 f,否则它会被读取为变量的值。这就是为什么变量函数被称为setq,“q”代表“quoted”所以​​setq实际上是一个特殊的函数,它引用了它的第一个参数,所以程序员不必这样做。有一个等效的普通函数称为 set,它不做任何引用,如:

(setq x 1)  ; x is 1
(set 'x 2)  ; x is 2
(setq x 'x) ; x is the symbol x
(set x 3)   ; x is now 3

最后一种形式可能看起来令人困惑,但由于 set 是一种正常形式,它将查找变量 x 的值,该值是符号 x 然后命名将要更改的变量(即 x)。因此,set 的一个优点是可以设置您不知道其名称但更确切地说是通勤的变量。

关于function - Emacs Lisp 可以将 lambda 形式分配给 Scheme 之类的变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60200613/

相关文章:

javascript - 检测 Canvas 内的鼠标点击位置

javascript - Extjs/Javascript - 在函数返回之前等待 MessageBox 响应

c - 使用无符号值返回错误?

c# - 如何从 Entity Framework 上的匿名查询更改数据

.net - 在单行 lambda 表达式中使用 function 而不是 sub 导致的错误

c++ - 捕获列表中捕获的行为 [c++]

debugging - 如何在方案中调试 gimp 的 script-fu 脚本?

c++函数指针声明导致程序在退出时崩溃

algorithm - 在Scheme中编写递归枚举函数

functional-programming - 在 DrRacket(或 Scheme)中以这种格式形成一棵树