有人可以解释一下使用elisp中cl包的具体问题吗?作为emacs中的一个新编码器,我觉得好像我在达到(require'cl)选项时犯了一个错误。我已经阅读并理解了cl包的字节编译问题。我看过旧的论点,不想重振它们。我也不是在寻找关于common-lisp是否优于x品牌lisp的通才评论。
我想知道的是几乎如何使用common-lisp,这样我写的任何elisp都有很大机会被大多数elisp编码器接受。具体来说,我是否应该完全避免使用普通的口齿不清,或者是否有一些语言的某些部分是可以接受的,而且某些部分的大多数编码人员会嗤之以鼻地嘲笑?
不希望限制答案的广度,是这样的:
(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-
字首。所以,例如,而不是一个 (position ...)
你将会拥有 (cl-position ...)
。从理论上讲,这将为您节省向前兼容性的问题。但是,函数不会立即被删除,您将在它们被弃用之前得到警告,并且将有大量时间进行更新。真的,由你决定。
Common Lisp中的循环宏本身就是一个争议,它不是语言的典型构造,这就是为什么,例如,迭代库存在的原因。它还要求你学习“循环迷你语言”以便很好地使用它,这是一种特定于领域的小语言,并且实际上并不要求这种构造使用它。但是,循环有其强大的一面。列表处理功能如 mapcar
要么 reduce
会在更琐碎的案件中为你服务,就像你在你的例子中所拥有的那样,但在不那么微不足道的情况下 loop
做同样的事情将是一种更好,也更简洁的方式。
你读过宏吗? 部分 手册?使用你的宏等 loop
例子是完全可以的。
但你会用 eval-when-compile
围绕要求。
事实上 (eval-when-compile (require 'cl))
在我的Emacs中的根lisp文件夹中出现66次。
除非您计划将代码集成到Emacs中,否则请使用CL包,并将此代码段放入您的代码中 .emacs
禁用警告。
(byte-compile-disable-warning 'cl-functions)
注意:您可以在elisp编程上找到一些建议 nicferrier的博客。