默认情况下KEYWORD包中会内驻哪些符号?不同Common Lisp实现是否有差异
关于Common Lisp中KEYWORD包预驻符号的问题解答
1. KEYWORD包默认内驻关键字的相关标准
ANSI Common Lisp标准并没有明确规定KEYWORD包必须预先内驻哪些固定关键字。KEYWORD包的符号本质是自动被定义为常量、默认导出的特殊符号:任何时候读取到:xxx格式的语法,或是主动调用(intern "XXX" "KEYWORD"),都会自动将对应符号加入KEYWORD包并设置为外部可访问。
2. 预驻关键字是否会随实现不同发生变化
会,不同Common Lisp实现的启动逻辑、内置工具链用到的关键字各不相同,会直接导致初始内驻的关键字存在差异,以下是实测的不同实现差异案例:
SBCL 初始状态测试结果
(find-symbol "CL" "KEYWORD") ; -> :CL, :EXTERNAL (find-symbol "CL-USER" "KEYWORD") ; -> :CL-USER, :EXTERNAL (find-symbol "COMMON-LISP" "KEYWORD") ; -> :COMMON-LISP, :EXTERNAL (find-symbol "COMMON-LISP-USER" "KEYWORD") ; -> NIL, NIL
CLISP 初始状态测试结果
(find-symbol "CL" "KEYWORD") ; -> NIL, NIL (find-symbol "CL-USER" "KEYWORD") ; -> NIL, NIL (find-symbol "COMMON-LISP" "KEYWORD") ; -> :COMMON-LISP, :EXTERNAL (find-symbol "COMMON-LISP-USER" "KEYWORD") ; -> NIL, NIL
上述差异的原因是SBCL的启动初始化流程中用到了:CL、:CL-USER两个关键字,所以启动后这两个符号已经被自动加入KEYWORD包;而CLISP的启动流程没有用到这两个关键字,所以初始状态下不存在。两者的包系统默认配置都用到了:COMMON-LISP关键字,所以默认都内驻了该符号。
3. 使用注意事项
不要依赖KEYWORD包的初始符号集合做逻辑判断,所有符合规范的Common Lisp实现都会在你第一次使用某个关键字时自动将其加入KEYWORD包,无需提前判断是否存在。
内容的提问来源于stack exchange,提问作者Flux
相关产品推荐
相关产品推荐

