在符号列表上调用打印对象

Invoking print-object on a list of symbols

我有一个符号、CLOS 对象的全局列表,以及相应的 print-object 定义的方法,可以为它们提供简洁的摘要。我想为用户提供一个 show-all 方法,该方法循环遍历它们并使用 print-object 打印我在 REPL 获得的相同输出。 earlier question 建议 method-function 查找具体方法,然后 funcall 它,但使用 closer-mop 不是一个选项。

我可以在循环中打印一个特定的对象,但不能遍历列表,例如:

(defun show-all (&optional (stream *standard-output*))
  "Print summaries for all objects in the current environment"
  (dolist (o *master-list*)
    (format t "~A~%" o) ; prints symbol name as text
    (print-object foo::my-object *standard-output*) ;prints my-object using print-object, this is what I want
    (print-object o *standard-output*))) ; same as format, prints symbol-name as text

有人知道这里发生了什么吗?如果我可以使用 print-object 在环境中打印特定对象,我应该能够在符号列表上循环打印所有对象。

符号与其命名的事物不同。

由于 print-object 是一个(通用)函数,因此适用正常评估。它获取 foo::my-objectvalue 作为参数。它永远不会看到符号 foo::my-object。如果您遍历一个符号列表,您仍然需要查找您想要的任何值,例如。 G。如果他们命名全局值,则使用 symbol-value

您已经将 print-object 方法专门用于某些 class,对吧?不是每个交易品种的 eql 专家?