emacs - emacs lisp中的`let loop`(命名为let)替代方案
问题描述
在 Scheme 中,有一个let loop
结构与就地创建自递归 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)Function Bindings
它是否在可能的情况下执行尾递归优化?
不,Emacs Lisp 中没有 TCO,除了正在进行的本机编译功能(目前默认情况下它被禁用,因此可能不考虑为一般用途做好准备;但即使是,它也会是依赖它而不是用于个人使用的风险,因为假设其他人也将运行本机编译的代码是不安全的)。
出于这个原因,elisp 程序员通常会避开任意递归,转而采用迭代技术。
推荐阅读
- c++ - 如何修复 bad_typeid 异常
- spring - 响应:状态 406 - 春天
- r - 将数据框加入多个列表
- r - 如何在r闪亮中固定主面板的位置
- android - LinearLayout 是否有替代 layout_alignBaseline
- php - 更改 PHP 数组中条目的键
- azure-devops - 如何将 Azure DevOps Extension for Azure CLI 与 Azure DevOps Server 一起使用?
- react-native - 从任何地方导航到子屏幕
- java - 使用正则表达式在字符串中搜索子字符串
- node.js - nodejs/vanilla 中的 Apollo-client 未触发订阅