elisp中的符号和scheme中的符号的区别

在scheme中 高阶函数 传递函数时 不用’ 引用 而在elisp中传递函数需要用 '引用 这是为什么

elisp 允许用符号指代函数,scheme 不允许罢了

Scheme 和 Emacs Lisp 是很不一样的语言,也可以从 Lisp-1 和 Lisp-2 的角度看:

Scheme 里函数和变量在同一个命名空间里(所谓的 “Lisp-1”),直接写函数名符号就可以求值到函数对象。

Emacs Lisp 的函数和变量是不同的命名空间(所谓的 “Lisp-2”),也就是说可以有一个变量叫 foo,同时还有一个函数叫 foo。写一个裸的 foo 会按变量求值,而不是求值到函数对象。所以常规的做法就是传递函数名符号。(Elisp 手册甚至直接说:A named function in Lisp is just a symbol with a valid function in its function cell。)

另外值得一提的是 Emacs Lisp 在有词法作用域之前是没有所谓的闭包的,求值 (lambda (x) (+ x y)) 会得到一个列表 '(lambda (x) (+ x y)),所以 quote 不 quote 在语义上没区别。(#' 相比 quote 有一个额外的作用是让 byte compiler 可以编译 lambda body。)

我上面说的这些你在 Emacs Lisp 的 info 里全部都能读到。推荐阅读。

8 个赞