Common Lisp-从方法和函数获取文档字符串吗?

时间:2018-07-13 10:27:04

标签: lisp common-lisp sbcl

这是先前询问过的question有关文档功能的跟进工作,该功能显然值得发表。

是否有一种方法可以动态获取SBCL中的函数/宏或方法的文档字符串?

到目前为止(文档function-name'function)为我提供了常规函数的文档字符串(并且我也假定为宏),但没有方法。 我尝试了“方法”,“标准方法”甚至“ t”,但它们似乎不起作用。

我的问题是,我所使用的环境(在基于Lisp的可视化编程界面中)充满了可以用作函数或方法的小引擎,我不知道如何区分它们。我只需要用户能够快速获取库中任何给定符号(或工具)的文档字符串,无论其类型是什么(如果存在)。

谢谢!

朱利安

1 个答案:

答案 0 :(得分:6)

符号名称函数,包括宏和泛型函数,但不包括方法。为了唯一地标识一种方法,您需要了解泛型函数以及所有适用的修饰符和特化剂。

例如,PRINT-OBJECT为通用函数命名,但不足以引用特定的方法。但是,您可以遍历专用于泛型函数的所有方法并处理其文档:不用给名称DOCUMENTATION传递名称,而是给函数对象和T。为了方便地执行此操作,请使用closer-mop

(ql:quickload :closer-mop)

例如:

(lambda (generic-function)
  (map 'list
       (lambda (method) (documentation method t))
       (closer-mop:generic-function-methods generic-function)))
=> #<FUNCTION (LAMBDA (GENERIC-FUNCTION)) {1001BBCD3B}>

让我们尝试一下:

CL-USER> (funcall * #'documentation)
(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)

糟糕。

CL-USER> (defmethod documentation ((test (eql :test)) _) 
             "Test documentation" 
           "Returned value")
...
CL-USER> (documentation :test t)
"Returned value"

CL-USER> (funcall *** #'documentation)
("Test documentation" NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)