You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.05 20:02:31