如何探索 Common Lisp 图像

Gra*_*ent 4 emacs common-lisp slime

有没有办法探索 Common Lisp 图像的当前状态(即加载的包、可用的符号等)?

我知道命令(apropos "foo"),但我想查看整个图像的当前状态。

有这样的探险家吗?我正在使用 SBCL 和 SLIME(在 Emacs 中)。

cor*_*ump 6

您可以使用以下命令列出所有现有包:

(list-all-packages)
Run Code Online (Sandbox Code Playgroud)

对于给定的包,您可以迭代其所有符号或其外部符号:

(do-symbols (sym package)
  ...)

(do-external-symbols (sym package)
  ...)
Run Code Online (Sandbox Code Playgroud)

您也可以直接列出所有包中的所有符号:

(do-all-symbols (sym)
  ...)
Run Code Online (Sandbox Code Playgroud)

使用 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.
Run Code Online (Sandbox Code Playgroud)

上面的NUMBERCOMMON-LISP文字也是按钮,可以点击访问关联值。如果你只使用SBCL,同样可以通过调用(find-class symbol nil)(NIL表示如果符号没有命名一个类就不应该报告错误)(symbol-plist symbol),等等来实现。

根据标准,有些东西是无法内省的,例如结构或所有用户定义类型的列表deftype(可能是其他东西)。根据您想要做什么,您可能需要查看执行此操作的特定于实现的方法。


感谢 David Hodge 指出以下几点:

来自 Rob Warnock 的名为 repl-utilities 的包有一个名为 summary 的简洁函数,它显示了每个函数、具有关联文档字符串的全局变量