在Scheme中有一个let循环
构造,它本质上与就地创建自递归lambda(又名“命名let”)相同。例如,6 的阶乘可以写为:
(let fact ([x 6])
(if (< 1 x)
(* x (fact (- x 1)))
x))
问题是:elisp中有没有其他选择。如果存在的话,它是否会在可能的情况下执行尾递归优化?
最佳答案
您正在寻找cl-labels
。请参阅https://stackoverflow.com/a/39564067/324105与您的代码非常相似的示例(以及一些其他相关设施)。
另请参阅:C-hig (cl)函数绑定(bind)
does it perform tail recursion optimization where possible?
不,Emacs Lisp 中没有 TCO,除了正在进行的工作 native-compilation功能(目前默认情况下禁用它,因此可能不被认为适合一般使用;但即使可以,除了个人使用之外依赖它也会存在风险,因为假设其他人会使用它是不安全的也运行 native 编译的代码)。
出于这个原因,elisp 程序员通常会避开任意递归,转而采用迭代技术。
关于emacs - `let loop`(名为let)emacs lisp中的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68017856/