为什么Emacs lisp中没有尾递归优化,不像其他方案一样?

10a*_*nts 6 lisp emacs recursion scheme elisp

Emacs lisp是LISP的一种方言,特别是Scheme.大多数计划解释器确实有Tail Recursion的优化,但是emacs lisp不行.我在`info elisp'搜索了一段时间的原因,但我找不到它.

PS是的,在elisp中还有其他的迭代语法,比如'while',但我仍然找不到他们没有像其他方案解释器那样实现尾递归的好理由.

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.但目前尚不清楚它是否会实现成果.

  • 我想你可能在最后一段中提到了guile emacs项目,其中elisp解释器被guile取代.然而,这并不是要用计划取代elisp - 重点是已经制定了直接支持elisp的诡计.如果你正在考虑这个问题,那么实际上已经进入了那个项目的重大努力 - 尽管它是否已经成熟到可能并且*实际上*成为标准GNU Emacs的一部分是任何人的猜测. (5认同)

Ste*_*fan 6

Emacs Lisp已经将动态范围作为其生命前25年的主要/唯一范围规则.动态作用域基本上与尾递归的优化不兼容,因此在Emacs-24(引入词法作用域)之前,对此优化几乎没有兴趣.

如今,ELisp有时可以从尾递归的优化中受益,并且已经提交了一些补丁,但尚未集成.缺少尾递归优化以及函数调用的相对低效的实现已经影响了ELisp样式,因此递归不经常使用,这反过来降低了添加尾调用优化的好处.


GDP*_*DP2 5

看起来有人在 Emacs Lisp 中实现了 TCO: https: //github.com/Wilfred/tco.el。我自己还没有使用过它,但如果您有兴趣了解 Emacs Lisp 中的 TCO,您可能想尝试一下。


Daa*_*uro 5

Emacs 28 引入了宏named-let,它可用于以优化的方式计算尾递归循环表达式。

虽然还没有对自动优化函数的直接支持,但我们可以在这些函数中使用上面的宏;或者,如果您喜欢冒险,请设置native-comp-speed为 3(也包括 Emacs 28+):GCCEmacs 的 Self TCO