当需要模块时,名称应该是字符串、符号还是关键字?

Flu*_*lux 3 common-lisp

以下有什么区别?

(require "asdf")  ; String.
(require 'asdf)   ; Symbol.
(require :asdf)   ; Keyword.
Run Code Online (Sandbox Code Playgroud)

需要模块时应该使用哪个?

小智 7

的参数require是一个字符串指示符,它是

字符串的指示符;也就是说,一个表示字符串的对象,它是以下之一:字符(表示以该字符为唯一元素的单例字符串)、符号(表示作为其名称的字符串)或字符串(表示其自身) )。

因此,上述任何一项都将起作用。 但是require定义为使用 对模块名称进行比较string=,这意味着大小写很重要。因此,这意味着(require 'asdf)相同(require :ASDF)的是一样的(require "ASDF"),但一样的(require "asdf")。(事实上,航空自卫队增加了两个"asdf",并"ASDF"*modules*这样既会工作)。

就个人而言,我使用关键字符号,所以(require :asdf), (provide :spotbat),这意味着*modules*总是以大写字符串结尾。


我发现使用string=比较模块名称的决定有点烦人,但现在就是这样,并且它还与各种其他约定兼容:例如,包名称区分大小写。并且理论上它允许,例如,区分大小写的首选语言与 CL 一起存在于同一图像中((find-package "cl")可能是导出其所有符号的包)。