问题描述
有没有办法探索 Common Lisp 图像的当前状态(即加载的包、可用的符号等)?
我知道命令 Some(s)
,但我想查看整个图像的当前状态。
有这样的探险家吗?我正在使用 SBCL 和 SLIME(在 Emacs 中)。
解决方法
您可以列出所有现有的包:
(list-all-packages)
对于给定的包,您可以迭代其所有符号或其外部符号:
(do-symbols (sym package)
...)
(do-external-symbols (sym package)
...)
你也可以直接列出所有包中的所有符号:
(do-all-symbols (sym)
...)
当使用 Slime 时,用 slime-inspect
检查一个符号会给出以该符号命名的所有事物的摘要;例如,如果我检查 'number
,则会显示以下内容:
#<SYMBOL {5024C0CF}>
--------------------
Its name is: "NUMBER"
It is unbound.
It has no function value.
It is external to the package: COMMON-LISP [unintern]
Property list: NIL
It names the class NUMBER [remove]
It names a primitive type-specifier.
上面的 NUMBER
和 COMMON-LISP
文本也是按钮,您可以点击这些按钮访问关联的值。如果你只使用 SBCL,同样可以通过调用 (find-class symbol nil)
(NIL 表示如果符号没有命名类不应该报告错误)、(symbol-plist symbol)
等来实现。
根据标准,有些东西是无法内省的,比如结构体或所有用 deftype
引入的用户定义类型的列表(也许是其他东西)。根据您要执行的操作,您可能需要查看特定于实现的方法。
感谢大卫·霍奇指出以下几点:
来自 Rob Warnock 的名为 repl-utilities 的包有一个名为 summary 的简洁函数,它显示了每个函数、全局变量以及相关的文档字符串
,这是一个图形化的网络浏览器:https://github.com/lokedhs/docbrowser
一旦启动,它会显示第一页,其中包含当前映像中加载的所有可用包的列表。点击一个包会显示它的函数和参数,以及它们的文档字符串,点击一个会显示它的源代码。