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

时间:2017-05-13 01:08:05

标签: 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-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)

但是那个电话会回复NIL。

我正在尝试构建一个函数,为我计划在GitHub上共享的Common Lisp包创建README.md文件。这是一个例子:https://github.com/macnod/dc-utilities。我在这里写了一篇关于此的帖子:https://donnieknows.com/documenting-common-lisp-for-github/

1 个答案:

答案 0 :(得分:8)

该标准针对Common Lisp函数documentation

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

三个运算符类型可以从中检索文档,因此参数function是:

  • 功能
  • 特别运营商

请记住,在Common Lisp中,运营商一次只能是其中之一。

实施例

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

宏不是编译器宏。这些由DEFINE-COMPILER-MACRO定义。