有人能解释一下在elisp中使用cl包的具体问题是什么吗?作为emacs的新手,每当我使用(require ' cl )选项时,我都觉得自己在犯错误。我已经阅读并理解了cl包的字节编译问题。我已经看过了旧的争论,不想再重复它们。我也不想寻求任何关于common-lisp是否比x品牌lisp更好的通才评论。
我想知道的是如何实际使用common-lisp,这样我编写的任何elisp都有很好的机会被大多数elisp程序员接受。具体地说,我是否应该完全避免使用通用的lisp,或者是否有一些语言的某些部分是每个人都可以接受的,而有些部分是大多数程序员会窃笑和嘲笑的?
不希望限制答案的广度,是这样的:
(mapcar (lambda(x) (* x x)) '(1 2 3))比这更容易接受:
(require 'cl)
(loop for el in '(1 2 3) collect (* el el))发布于 2012-10-29 16:07:38
虽然使用了很多第三方库并编写了一些自己的eLisp代码,但我从未遇到过使用CL包导致名称冲突的情况。因此,我很想说,反对使用CL的论点只不过是清教徒(在单词的原始意义上,并不是指事物的宗教方面)。
但是,如果你计划一个很长时间的支持,并且你想要有某种备份,我会这样做(但我自己不会这么做,因为一旦故障就修复似乎是一个更好的策略)。对于您正在使用的CL包中的函数,请创建一个特殊的文件,在该文件中,您可以defalias所有这些函数,使其具有cl-前缀。因此,例如,您可以使用(cl-position ...)来代替(position ...)。理论上可以省去向前兼容性的问题。然而,函数不会立即删除,您将在它们被弃用之前收到警告,并且将有大量时间进行更新。由你决定,真的。
Common Lisp中的循环宏本身就存在争议,它不是该语言的典型结构,这就是迭代库存在的原因。它还要求您学习“循环迷你语言”来很好地使用它,这是一种小型的特定于领域的语言,并且实际上没有要求这种构造使用一种语言。但是,循环有其强大的一面。列表处理函数,如mapcar或reduce,在更琐碎的情况下可以很好地为您服务,就像您在示例中使用的一样,但是在不那么琐碎的情况下,loop将是一种更好的、也更少冗长的方法来做同样的事情。
发布于 2012-10-29 19:11:31
你读过手册中的宏section吗?使用像loop示例这样的宏是完全可以的。
但是你可以在需要的时候使用eval-when-compile。
事实上,(eval-when-compile (require 'cl))仅仅在我的Emacs的lisp根文件夹中就出现了66次。
发布于 2012-10-29 20:24:11
除非您计划将代码集成到Emacs中,否则请使用CL包,并将此代码片段放入.emacs中以禁用警告。
(byte-compile-disable-warning 'cl-functions)注意:你可以在nicferrier's blog上找到一些关于elisp编程的建议。
https://stackoverflow.com/questions/13116184
复制相似问题