emacs - 我如何最好地在 elisp 中使用 common-lisp(如果有的话)?

标签 emacs lisp elisp common-lisp

有人可以解释一下在 elisp 中使用 cl 包的具体问题吗?作为 emacs 的新编码员,每当我使用 (require 'cl) 选项时,我都觉得自己好像犯了一个错误。我已经阅读并理解了 cl 包的字节编译问题。我已经看过旧的论点,不想重提它们。我也不是在寻找关于 common-lisp 是否比 x brand lisp 更好的通才评论。

我想知道的是如何实际使用 common-lisp,以便我编写的任何 elisp 都有很好的机会被大多数 elisp 编码人员接受。具体来说,我应该完全避免使用 common lisp,还是语言的某些部分是每个人都可以接受的,而某些部分是大多数编码人员会窃笑和 mock 的?

不想限制答案的广度,是这样的:

(mapcar (lambda(x) (* x x)) '(1 2 3))

比这更容易接受:

(require 'cl)
(loop for el in '(1 2 3) collect (* el el))

最佳答案

虽然使用了很多第三方库,也写了一些自己的eLisp代码,但我从来没有遇到过使用CL包导致名称冲突的情况。所以,我很想说反对使用 CL 的论点只不过是清教徒主义(在这个词的本义上,并不是指事物的宗教方面)。

但是,如果您计划长期支持并且想要某种备份,这就是我会做的(但我自己并没有这样做,因为一旦它们坏了就修复似乎是一个更好的策略)。对于您正在使用的 CL 包中的函数,创建一个特殊文件,您在其中defalias 所有这些函数都具有 cl- 前缀。因此,例如,您将拥有 (cl-position ...) 而不是 (position ...)。理论上会为您省去向前兼容的问题。但是函数不会立即删除,您会在它们被弃用之前收到警告,并且会有很多时间进行更新。真的,取决于你。

Common Lisp 中的循环宏本身就是一个争议,它不是该语言的典型构造,这就是为什么存在迭代库等。它还需要您学习“循环迷你语言”才能很好地使用它,这是一种小型的特定于领域的语言,实际上不需要这种构造使用它。但是,循环有其强大的一面。列表处理函数,如 mapcarreduce 将在更琐碎的情况下为您提供很好的服务,就像您在示例中使用的那样,但在不太琐碎的情况下 loop 将是做同样事情的更好且更简洁的方式。

关于emacs - 我如何最好地在 elisp 中使用 common-lisp(如果有的话)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13116184/

相关文章:

python - Emacs 中的单元模式

emacs - 我无法初始化 swank 和 clojure-jack-in

emacs - 使用 Emacs 在光标下的链接上调用外部程序

lisp - 通过在 racket 中设计一个解释器来重写这个脚本

scheme - 在Scheme中调试一个简单的列表函数?

emacs - 在 Emacs Lisp 中分配给自由变量有什么危险?

c++ - Git 破坏了我的程序?

python - Spacemacs python层: Invalid version syntax

python - 将 lisp 数据结构导入 python

Emacs 声称我引用了一个 lambda,但我不是