Macros Common Lisp:获取宏的文档字符串

Macros Common Lisp:获取宏的文档字符串,macros,documentation,common-lisp,Macros,Documentation,Common Lisp,在SBCL中,我可以获得函数的文档字符串,如下所示: (documentation #'mapcar t) 但是,我不明白如何获取宏的文档字符串。例如,给定宏: (defmacro with-lines-in-file ((line filename) &body body) "Runs body for each line in the file specified by filename." (let ((file (gensym))) `(with-open-fi

在SBCL中,我可以获得函数的文档字符串,如下所示:

(documentation #'mapcar t)
但是,我不明白如何获取宏的文档字符串。例如,给定宏:

(defmacro with-lines-in-file ((line filename) &body body)
  "Runs body for each line in the file specified by filename."
  (let ((file (gensym)))
    `(with-open-file (,file ,filename)
      (do ((,line (read-line ,file nil) (read-line ,file nil)))
          ((null ,line) nil)
        ,@body))))
我无法检索文档字符串。我不理解CLHS。正如您在下面看到的,CLHS对于获取函数的文档字符串非常有用

documentation (x function) (doc-type (eql 't))
但是,从宏中获取文档字符串的位似乎对我不起作用:

documentation (x symbol) (doc-type (eql 'compiler-macro))
在我的宏上下文中,我将上述CLHS位解释为:

(documentation 'with-lines-in-file 'compiler-macro)
但该呼叫返回零


我正在尝试构建一个函数,为我计划在GitHub上共享的公共Lisp包创建README.md文件。下面是一个例子:。我在这里写了一篇关于这一点的帖子:。

标准中说,对于公共Lisp函数:

函数如果x是函数名,则返回名称为x的函数、宏或特殊运算符的文档字符串

因此,可以使用参数
function
检索文档的三种运算符类型为:

  • 作用
  • 特种操作员
记住,在公共Lisp中,操作符一次只能是其中一个

范例

CL-USER> (defmacro foomacro () "foo macro" '(foo))
FOOMACRO
CL-USER> (documentation 'foomacro 'function)
"foo macro"

宏不是编译器宏。这些宏是由定义的。

编译器宏与常规宏不同。您应该使用
(documentation…”函数)
获取宏docstring。谢谢您的回答。我明白了我需要更仔细地阅读文档。我很抱歉时间太紧了。