当我这样做时:
(defparameter thing #'(lambda () (+ 1 1)))
thing
的返回值为
#<FUNCTION (LAMBDA ()) {53A11BEB}>
此打印输出看起来很像 CLOS 的打印对象。
所以,我想在
print-object
中看到实际的功能细节。
我似乎无法找到要在我的
list-class-slots
函数中使用的函数对象的名称:
(defun list-class-slots (class)
(mapcar #'sb-mop::slot-definition-name
(sb-mop::class-direct-slots (class-of (make-instance class)))))
我尝试了
sb-mop::funcallable-standard-class
,但这返回零。我也尝试过 function
,错误告诉我使用 funcallable-standard-class。
我错了吗?原始的 lambda 打印输出与 CLOS 完全无关吗?如果不是,函数打印输出的来源是什么?
使用
lambda
创建的函数是一个对象,是的。它是 系统类 function
: 的一个实例
* (class-of thing)
#<SB-PCL:SYSTEM-CLASS COMMON-LISP:FUNCTION>
函数以“依赖于实现的方式”打印,在实践中通常采用“不可读”值的约定(#<...>
)。看来 SBCL 对函数的print-object
泛型方法有专门化。
* (find-method #'print-object '() (mapcar #'find-class '(function t)))
#<STANDARD-METHOD COMMON-LISP:PRINT-OBJECT #'T {100042B4C3}>
确实,就是这里。您可以在其中查看它是如何工作的。