如何打印LISP函数的docstring?现有代码存在什么问题?
问题分析与解决方案
首先得明确你用的是哪种LISP方言——这是关键!你的代码在不同方言里的表现完全不一样:
如果你用的是Common Lisp
你的代码语法其实是符合标准的,但可能有两个小问题导致你拿不到文档字符串:
- 有些LISP实现对文档字符串的识别需要更明确的结构,虽然单行写法
(defun pr(x) "This is a docstring!" (+ x 1))在标准CL里是合法的,但把文档字符串单独拆成一行会更稳妥,也更容易被实现识别:(defun pr (x) "This is a docstring!" (+ x 1)) - 调用
documentation时,指定明确的文档类型会比用t更可靠。试试用(documentation #'pr 'function)代替(documentation #'pr t)——t表示匹配任意文档类型,但明确指定'function能避免一些边缘情况。
如果还是不行,检查下你的LISP实现是否默认关闭了文档记录功能(有些轻量实现会这么做),或者你是否在定义函数后不小心重新覆盖了它。
如果你用的是Scheme(比如Racket、Guile)
这就是问题所在了!Scheme和Common Lisp的文档字符串机制完全不同——Scheme不会自动把函数体的第一个字符串当作文档。你需要用方言特定的方式添加文档:
- Racket:可以用带文档的定义语法,或者通过显式关联获取:
;; 方式1:使用Racket的文档语法 (define (pr x) @doc{This is a docstring!} (+ x 1)) ;; 方式2:显式绑定文档后获取 (define pr (procedure-rename (lambda (x) (+ x 1)) 'pr "This is a docstring!")) (procedure-documentation pr) ; 会返回文档字符串 - Guile:用
define*配合#:doc参数:(define* (pr x) #:doc "This is a docstring!" (+ x 1)) (procedure-documentation pr) ; 获取文档
简单来说,你的代码在Common Lisp里是对的,但可能需要调整调用方式或写法;如果是Scheme,那写法本身不符合方言的文档规范,得换用对应方言的方法。
内容的提问来源于stack exchange,提问作者Ryan Cocuzzo
相关产品推荐
相关产品推荐

