ton*_*day 11 lisp emacs elisp common-lisp
有人可以解释一下使用elisp中的cl包的具体问题吗?作为emacs中的一个新编码器,我觉得好像我在达到(require'cl)选项时犯了一个错误.我已经阅读并理解了cl包的字节编译问题.我看过旧的论点,不想重振它们.我也不是在寻找关于common-lisp是否优于x品牌lisp的通才评论.
我想知道的是几乎如何使用common-lisp,以便我写的任何elisp都有很大机会被大多数elisp编码器接受.具体来说,我是否应该完全避免使用普通的lisp,或者是否存在一些人人都可以接受的语言部分以及大多数编码人员会窃听和嘲笑的某些部分?
不希望限制答案的广度,是这样的:
(mapcar (lambda(x) (* x x)) '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
比这更可接受:
(require 'cl)
(loop for el in '(1 2 3) collect (* el el))
Run Code Online (Sandbox Code Playgroud)
小智 8
在使用大量第三方库并编写我自己的一些eLisp代码时,我从未遇到过使用CL包导致名称冲突的情况.因此,我很想说反对使用CL的论点只不过是清教主义(在原始意义上,并不意味着事物的宗教方面).
但是,如果你计划在很长一段时间内获得支持,并希望得到某种备份,那么这就是我要做的事情(但我自己并没有这样做,因为一旦它们被破坏就修复它们似乎更好战术).对于您正在使用的CL包中的函数,创建一个特殊文件,其中defalias所有文件都有一个cl-前缀.所以,例如,而不是拥有(position ...)你想拥有的(cl-position ...).从理论上讲,它将为您节省向前兼容性的问题.但是,函数不会立即被删除,您将在它们被弃用之前得到警告,并且将有大量时间进行更新.真的,由你决定.
Common Lisp中的循环宏本身就是一个争议,它不是语言的典型构造,这就是为什么,例如迭代库存在的原因.它还要求你学习"循环迷你语言"以便很好地使用它,这是一种特定于领域的小语言,并且实际上并不要求这种构造使用它.但是,循环有其强大的一面.列出处理函数,例如mapcar或reduce将在更琐碎的情况下很好地为你服务,就像你在你的例子中那样,但在不那么微不足道的情况下loop,做同样的事情将是一种更好,也更简洁的方式.