我对HyperSpec中defun文档字符串规范的理解是否有误?
Common Lisp defun文档字符串的规范与实现疑问
从表面上看,SBCL、Clozure Common Lisp和CLISP对defun的实现似乎在某些情况下未能正确处理文档字符串。是我对HyperSpec的解读存在偏差(大概率),还是HyperSpec本身存在缺陷,亦或是这三个实现都出现了相同的错误?
HyperSpec的规定
HyperSpec对defun的语法定义为:
defun function-name lambda-list [[declaration* | documentation]] form*
同时其1.4.1.2.1节说明了修改后的BNF语法中拼接表达式的规则。
我的解读
根据defun语法和BNF规则,我认为lambda列表后可跟任意数量声明、至多一个文档字符串,以及任意数量体形式。这让我认为可以定义仅含文档字符串无函数体的函数存根,如:
(defun func-a () "This is FUNC-A.")
但这会引发歧义:如何区分文档字符串和作为返回值的字符串?这似乎是HyperSpec的潜在缺陷。
实际测试情况
定义两个函数后,REPL交互显示:func-a的文档字符串被当作函数体返回,未被识别为文档;func-b在文档字符串后加nil体形式,其文档字符串被正确识别。SBCL、CCL、CLISP均表现出此行为:无文档字符串时可零体形式,有文档字符串时需至少一个体形式。
核心疑问
这种现象是HyperSpec的已知缺陷被三个实现统一修正,还是我对规范的解读有误?
内容的提问来源于stack exchange,提问作者ad absurdum
相关产品推荐
相关产品推荐

