如何在Common Lisp REPL中查看文档字符串和其他符号信息?

27
我完全不了解CL,我想学习如何从REPL读取文档字符串和获取其他帮助信息。就像Python中的help(symbol)或iPython中的symbol?,还有Haskell的GHCi中的:t:i一样。因此,给定一个符号名称,我想知道以下内容:
  • 它绑定的值的种类(函数、变量、没有任何绑定)
  • 如果它是一个函数或宏,那么它的位置参数是什么
  • 如果有文档字符串,显示它
  • 它来自哪个包或文件,或者是什么时候定义的
我发现有(documentation '_symbol_ '_type_),但这并不完全满足我的需求。在使用documentation之前,我需要知道符号绑定的值的类型(例如'function'variable'compiler-macro等)。然后,它只返回文档字符串,可能缺失或不足以使用该符号。
例如,在Lisp中,mapcar的帮助信息并不是很有用(CLisp的REPL):
> (documentation 'mapcar 'function)
NIL

我希望能看到类似以下的内容:

我想要看到这样的东西:

>>> map?
Type:       builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form:    <built-in function map>
Namespace:  Python builtin
Docstring:
    map(function, sequence[, sequence, ...]) -> list

    Return a list of the results of applying the function to the items of
    the argument sequence(s).  If more than one sequence is given, the
    function is called with an argument list consisting of the corresponding
    item of each sequence, substituting None for missing values when not all
    sequences have the same length.  If the function is None, return a list of
    the items of the sequence (or a list of tuples if more than one sequence).

2
你正在使用哪个编译器?在我的CL中,(documentation 'mapcar 'function)会显示:"将 FUNCTION 应用于列表的连续元素。返回由 FUNCTION 返回值组成的列表。" - Ken
10
(inspect 'mapcar)(describe 'mapcar) 可能是你正在寻找的,但这些函数的实际效用取决于具体的实现方式。 - Daniel Dickison
3
谢谢,@Daniel。确实,inspectdescribe正是我要找的。谢谢。如果你写成答案,我可以接受它。@Ken:我已经安装了CLisp和SBCL,但到现在为止我大多使用CLisp(因为其具有readline功能的REPL对我来说更好)。SBCL的文档字符串确实更有用,但它仍然只是一个文档字符串(还需要找到符号类型和参数列表)。 - sastanin
在全局上下文中,符号并不是与值“绑定”在一起,而是包含对值的引用,可能同时引用多种类型的值。请注意,文档字符串是对象的属性,而不是符号的属性。符号也可以命名词法上下文中的绑定,但这是词法环境的属性,而不是符号的属性。不幸的是,在内省这些内容之前,标准化委员会已经耗尽了时间和金钱,因此它取决于实现。 - Ramarren
如果您想要一个更加用户友好的REPL,或者Slime,请使用rlwrap sbcl。 - coredump
显示剩余3条评论
2个回答

31

如上所述,Common Lisp有标准函数:DESCRIBEINSPECTDOCUMENTATION。典型的Lisp IDE也将这些绑定到快捷键和菜单上。

对于标准的Common Lisp功能,大多数IDE都直接使用快捷键链接到Common Lisp HyperSpec文档。

大多数IDE还有显示参数列表和文档的快捷键。还有“空格参数列表”功能。

LispWorks特定的示例:LispWorks参数列表信息LispWorks表达式菜单

我推荐阅读你正在使用的IDE的SlimeLispWorks编辑器Allegro CL的ELI等IDE手册。


在CLISP中,直接从终端输入所有的DESCRIBE、INSPECT和DOCUMENTATION都没有解释任何东西... - DPColombotto
@dpcolombotto:我这里运行着CLISP,这些函数解释了很多。 - Rainer Joswig

9
关于您关于获取符号类型的问题:这样的东西不存在。或者更准确地说,符号不仅仅是其他对象的名称,而是SYMBOL类型的对象本身。每个符号都可以有变量值和函数值。要检查它是否具有变量值,请使用BOUNDP,要检查其是否具有函数值,请使用FBOUNDP

1
谢谢。我明白符号可以被解除绑定。了解boundpfboundp是很有用的。对于交互使用来说,似乎describe已经足够了。 - sastanin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接