【发布时间】:2020-08-07 17:29:31
【问题描述】:
我试图了解 Emacs Lisp 中的所有循环结构。
在一个示例中,我尝试遍历符号列表并将它们打印到 *message* 缓冲区,如下所示:
(let* ((plist package-activated-list) ;; list of loaded packages
(sorted-plist (sort plist 'string<)))
(--map (message (format "%s" it)) sorted-plist))
--map 是 dash.el 包中的一个函数。
如何在纯 Elisp 中做到这一点?
现在我如何在 Elisp 中迭代一个列表,而不使用其他包。
我见过一些使用while 和dolist 宏的例子,例如这里:
https://www.gnu.org/software/emacs/manual/html_node/elisp/Iteration.html
但这些都是破坏性的、非功能性的方式来表达循环。
来自Scheme(大约 20 年前曾与它和 SICP 合作过!),我倾向于更喜欢功能性、非破坏性(是否总是导致递归?)表达想法的方式。
那么在 Emacs Lisp 中遍历项目列表的惯用方法是什么?
另外:有没有办法在 Emacs Lisp 中以函数方式表达循环?
到目前为止我发现了什么
- 循环宏(来自 Common Lisp?)前缀为“cl-*”
https://www.gnu.org/software/emacs/manual/html_node/cl/Loop-Facility.html
- 迭代子句
https://www.gnu.org/software/emacs/manual/html_node/cl/Iteration-Clauses.html#Iteration-Clauses
Dash.el
https://github.com/magnars/dash.el
Magnar Sveen 的出色软件包以“Emacs 的现代列表 api。不需要 'cl。”进行营销。
还有什么?有什么推荐的读物吗?
【问题讨论】: