emacs - `let loop`(名为let)emacs lisp中的替代方案

标签 emacs iteration let

在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/

相关文章:

c# - 如何在不使用反射的情况下在 C# 中迭代​​结构变量?

为什么 Swift let 在类中是可变的?

syntax - Lisp DO变量语法推理

lisp - 如何格式化嵌套的多值绑定(bind)?

git - 直接从 Emacs 创建 pull 请求

Python将递归排列函数转换为迭代函数

linux - 在 Emacs 中匹配括号的命令是什么?

arrays - 标量上下文中新 'each @array'的行为

graphics - 如何在 Emacs 中绘制到 XY 位置?

linux - 在没有 XServer 的系统上启动时运行 Emacs