【问题标题】:Common Lisp - Get docstring from methods AND functions?Common Lisp - 从方法和函数中获取文档字符串?
【发布时间】:2018-07-13 10:27:04
【问题描述】:

这是之前向question 询问的有关文档功能的后续内容,显然值得单独发布。

有没有办法在 SBCL 中动态获取函数/宏或方法的文档字符串?

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

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

谢谢!

朱利安

【问题讨论】:

  • 如果您只想查看文档,DESCRIBE 会更合适。 DOCUMENTATION 仅在您想以某种方式处理字符串时才需要。

标签: lisp common-lisp sbcl


【解决方案1】:

符号命名函数,包括宏和通用函数,但不包括方法。为了唯一标识一个方法,您需要知道泛型函数以及所有适用的修饰符和专门化符。

例如,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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-26
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2011-07-02
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多