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

如何打印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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:51:22