Common Lisp中#:与:定义包的区别、优劣及无内部化关键字优势
Common Lisp中
#:foo与:foo定义包的区别及优劣 二者的核心区别
:foo是关键字符号,属于:keyword包,是已经被全局内部化(intern)的符号,只要写出:foo,这个符号就会永久存在于:keyword包中。#:foo是未内部化的普通符号,它不属于任何包,也不会被自动添加到任何包的符号表中,仅作为提供"FOO"这个名字的临时符号,仅在当前表达式上下文有效。
关于“#:表示关键字未被内部化”的说法
这个表述不准确:#:foo本身不是关键字符号,它是一个未被内部化的普通符号。关键字符号特指:keyword包中的符号,#:语法生成的符号和关键字包没有关联。
使用#:foo定义包的优势
- 避免污染关键字包:用
:foo定义包时,:foo符号会永久留在:keyword包中。若项目定义大量包,会导致关键字包积累不必要的符号,而#:foo不会留下任何残留。 - 语义更准确:包名本质是字符串标识,用未内部化符号传递包名,更贴合“仅传递名字”的语义,而非引用一个已存在的关键字符号。
哪种写法更优?
两种写法都能正常完成包定义功能,没有绝对优劣,更多是风格选择:
- 追求关键字包干净、语义严谨的开发者更倾向于
#:foo; - 偏好写法简洁、可读性强的开发者会选择
:foo,这也是不少成熟项目的常用写法。
内容的提问来源于stack exchange,提问作者djhaskin987
相关产品推荐
相关产品推荐

