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

标签 lisp common-lisp sbcl

这是对之前提出的问题 question 的跟进关于文档功能,这显然值得单独发表。

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

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

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

谢谢!

朱利安

最佳答案

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

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

关于lisp - Common Lisp - 从方法和函数中获取文档字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51323052/

相关文章:

lisp - 使用 Lisp 计算阶乘

lisp - 如何使用 SBCL sb-alien 创建一个 Gtk4 窗口打开它并有一个有效的简单回调?

optimization - 如何让 SBCL 优化掉对 DEFINITION 的可能调用?

performance - Elisp 在 Windows 和 Linux 上的性能

emacs:将数字行的绑定(bind)切换为等效的 <shift>-ed

lisp - 堆栈弹出不返回

lisp - 普通口齿不清 : Use undefined variable in function

lisp - 捕获 cl-fad :walk-directory output for finding files

matlab - 循环中的 Common Lisp 暂停命令

lisp - 为什么这会让我进入 SBCL 中的 LDB?