Common lisp 如何在公共lisp CLOS中指向defgeneric实例

Common lisp 如何在公共lisp CLOS中指向defgeneric实例,common-lisp,clos,Common Lisp,Clos,这里是lisp初学者 我了解了如何使用functionfind method指向特定的方法实例,通过对返回的方法实例使用slime inspect,我看到它有一个slot%GENERIC-function,但我无法使用它 (为什么(插槽值(查找方法…)'%GENERIC-FUNCTION) 告诉我对象缺少插槽 那么,如何从defmethod对象指向defgeneric呢? 我正在使用sbcl,但是否有标准化的通用lisp方法来实现兼容性?%GENERIC-FUNCTION可能指的是当前包中的符号

这里是lisp初学者

我了解了如何使用functionfind method指向特定的方法实例,通过对返回的方法实例使用slime inspect,我看到它有一个slot%GENERIC-function,但我无法使用它

(为什么
(插槽值(查找方法…)'%GENERIC-FUNCTION)
告诉我对象缺少插槽

那么,如何从defmethod对象指向defgeneric呢?
我正在使用sbcl,但是否有标准化的通用lisp方法来实现兼容性?

%GENERIC-FUNCTION
可能指的是当前包中的符号,而不是标识插槽的内部包中的符号。它们具有相同的名称,但属于不同的包

您所做的与CLOS的元对象协议(MOP)有关,请参阅以获取更多信息(另请阅读)

让我们首先加载
更近的拖把

USER> (ql:quickload :closer-mop)
To load "closer-mop":
  Load 1 ASDF system:
    closer-mop
; Loading "closer-mop"

(:CLOSER-MOP)
该系统是:

[…]一个兼容性层,用于纠正许多缺失或不完整的问题 广泛的通用Lisp中存在不正确的CLOS MOP功能 实现

(回想一下,
*
***
是表示REPL中计算的最后一个和倒数第二个值的变量)

评论 此插槽的
SB-PCL::%GENERIC-FUNCTION
符号未导出(我们需要两个冒号来引用它),它以
%
字符开头,这是内部的约定(有时是危险的)符号。您不应该直接使用它;也不建议直接调用
插槽值
,通常您只需要访问器函数

方法通用函数
相反,您应该使用从
closer mop
导出的符号,以获得更好的兼容性:

(closer-mop:method-generic-function 
  (find-method #'print-object () (mapcar #'find-class '(vector t))))

%GENERIC-FUNCTION
可能指的是当前软件包中的符号,而不是标识插槽的内部软件包中的符号。它们具有相同的名称,但属于不同的软件包

您所做的与CLOS的元对象协议(MOP)有关,请参阅以获取更多信息(另请阅读)

让我们首先加载
更近的拖把

USER> (ql:quickload :closer-mop)
To load "closer-mop":
  Load 1 ASDF system:
    closer-mop
; Loading "closer-mop"

(:CLOSER-MOP)
该系统是:

[…]一个兼容性层,用于纠正许多缺失或不完整的问题 广泛的通用Lisp中存在不正确的CLOS MOP功能 实现

(回想一下,
*
***
是表示REPL中计算的最后一个和倒数第二个值的变量)

评论 此插槽的
SB-PCL::%GENERIC-FUNCTION
符号未导出(我们需要两个冒号来引用它),它以
%
字符开头,这是内部的约定(有时是危险的)符号。您不应该直接使用它;也不建议直接调用
插槽值
,通常您只需要访问器函数

方法通用函数
相反,您应该使用从
closer mop
导出的符号,以获得更好的兼容性:

(closer-mop:method-generic-function 
  (find-method #'print-object () (mapcar #'find-class '(vector t))))
(find method#'print-object()(list'vector t))
不可移植。您需要传递类对象列表。请参阅CLHS 7.6.2:参数专用程序名称在用作用户级界面(defmethod)的宏中使用,而参数专用程序在函数界面中使用。
(find method#'print-object()(list'vector t))
不可移植。您需要传递类对象的列表。请参阅CLHS 7.6.2:参数专门化器名称用于用作用户级界面(defmethod)的宏中,而参数专门化器则用于功能界面。
(closer-mop:method-generic-function 
  (find-method #'print-object () (mapcar #'find-class '(vector t))))