繁体   English   中英

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

[英]How do I best use common-lisp in elisp (if at all)?

有人可以解释一下使用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))

在使用大量第三方库并编写我自己的一些eLisp代码时,我从未遇到过使用CL包导致名称冲突的情况。 因此,我很想说反对使用CL的论点只不过是清教主义(在原始意义上,并不意味着事物的宗教方面)。

但是,如果你计划在很长一段时间内获得支持,并希望得到某种备份,那么这就是我要做的事情(但我自己并没有这样做,因为一旦它们被破坏就修复它们似乎更好战术)。 对于CL包的功能,你正在使用,创建一个特殊的文件,在这里你defalias个个有cl-前缀。 因此,例如,您将拥有(cl-position ...) (position ...)而不是(cl-position ...) 从理论上讲,它将为您节省向前兼容性的问题。 但是,函数不会立即被删除,您将在它们被弃用之前得到警告,并且将有大量时间进行更新。 真的,由你决定。

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

您是否阅读过本手册的宏部分 使用诸如loop示例之类的宏是完全可以的。

但是你可以在require周围使用eval-when-compile

事实上(eval-when-compile (require 'cl))出现在我的Emacs的root lisp文件夹中66次。

除非您计划将代码集成到Emacs中,否则请使用CL包,并将此代码段放在.emacs以禁用警告。

(byte-compile-disable-warning 'cl-functions)

注意:您可以在nicferrier的博客上找到关于elisp编程的一些建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM