首页 > 解决方案 > emacs lisp中的`let loop`(命名为let)替代方案

问题描述

在 Scheme 中,有一个let loop结构与就地创建自递归 lambda(又名“命名 let”)基本相同。例如,6 的阶乘可以写成:

(let fact ([x 6])
  (if (< 1 x)
      (* x (fact (- x 1)))
      x))

问题是:elisp 中是否有任何替代方案。如果存在,它是否会在可能的情况下执行尾递归优化?

标签: emacsiterationlet

解决方案


你正在寻找cl-labels. 请参阅https://stackoverflow.com/a/39564067/324105以获取与您的代码非常相似的示例(以及其他一些相关工具)。

也可以看看:C-hig (cl)Function Bindings

它是否在可能的情况下执行尾递归优化?

不,Emacs Lisp 中没有 TCO,除了正在进行的本机编译功能(目前默认情况下它被禁用,因此可能不考虑为一般用途做好准备;但即使是,它也会是依赖它而不是用于个人使用的风险,因为假设其他人将运行本机编译的代码是不安全的)。

出于这个原因,elisp 程序员通常会避开任意递归,转而采用迭代技术。


推荐阅读