Bar*_*mar 13
Emacs Lisp创建于1980年代.Emacs作者(Richard Stallman)当时最熟悉的Lisp方言是MIT Maclisp,而Emacs Lisp与它非常相似.它使用动态变量作用域,没有词法闭包或尾递归优化,而Emacs Lisp是相同的.
Emacs Lisp与Scheme非常不同.最大的区别是Scheme是词法范围的,但是最近才将其添加到Emacs Lisp中,并且必须在每个文件的基础上启用(通过放在;;; -*- lexical-binding: t -*-第一行),因为默认情况下这样做会导致许多不兼容性.
已经有一些工作要用方言方言Guile取代Emacs Lisp.但目前尚不清楚它是否会实现成果.
Emacs Lisp已经将动态范围作为其生命前25年的主要/唯一范围规则.动态作用域基本上与尾递归的优化不兼容,因此在Emacs-24(引入词法作用域)之前,对此优化几乎没有兴趣.
如今,ELisp有时可以从尾递归的优化中受益,并且已经提交了一些补丁,但尚未集成.缺少尾递归优化以及函数调用的相对低效的实现已经影响了ELisp样式,因此递归不经常使用,这反过来降低了添加尾调用优化的好处.
看起来有人在 Emacs Lisp 中实现了 TCO: https: //github.com/Wilfred/tco.el。我自己还没有使用过它,但如果您有兴趣了解 Emacs Lisp 中的 TCO,您可能想尝试一下。
Emacs 28 引入了宏named-let,它可用于以优化的方式计算尾递归循环表达式。
虽然还没有对自动优化函数的直接支持,但我们可以在这些函数中使用上面的宏;或者,如果您喜欢冒险,请设置native-comp-speed为 3(也包括 Emacs 28+):GCCEmacs 的 Self TCO