Jul*_*not 4 lisp sbcl common-lisp
这是关于文档功能的这个先前提出的问题的后续,这显然应该是自己的帖子.
有没有办法动态获取函数/宏的文档字符串或SBCL中的方法?
到目前为止(文档函数名称'函数)获取常规函数的文档字符串(我也假设宏),但不是方法.我试过'方法',标准方法,甚至'但它们似乎不起作用.
我的问题是我使用的环境(在基于Lisp的可视化编程接口中)充满了可以是函数或方法的小引擎,我不知道如何区分它们.我只需要用户能够快速获取库中任何给定符号(或工具)的文档字符串,无论其类型如何,如果它存在的话.
谢谢 !
朱利安
符号名称函数,包括宏和泛型函数,但不包括方法.为了唯一地标识方法,您需要知道泛型函数和所有适用的修饰符和特化器.
例如,PRINT-OBJECT命名泛型函数,但不足以引用特定方法.但是,您可以遍历所有专门用于泛型函数的方法并操作它们的文档:不是传递名称DOCUMENTATION,而是给出函数对象和T.为了便于携带,请使用close -mop:
(ql:quickload :closer-mop)
Run Code Online (Sandbox Code Playgroud)
例如:
(lambda (generic-function)
(map 'list
(lambda (method) (documentation method t))
(closer-mop:generic-function-methods generic-function)))
=> #<FUNCTION (LAMBDA (GENERIC-FUNCTION)) {1001BBCD3B}>
Run Code Online (Sandbox Code Playgroud)
我们来试试吧:
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)
Run Code Online (Sandbox Code Playgroud)
哎呀.
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)
Run Code Online (Sandbox Code Playgroud)