lambda 函数是 CLOS 对象吗?

问题描述 投票:0回答:1

当我这样做时:

(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 完全无关吗?如果不是,函数打印输出的来源是什么?

function common-lisp sbcl clos
1个回答
0
投票

使用

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}>
确实,

就是这里
。您可以在其中查看它是如何工作的。

© www.soinside.com 2019 - 2024. All rights reserved.