Common lisp 如何在具有多个键参数CLO的初始化实例中使用call next方法

Common lisp 如何在具有多个键参数CLO的初始化实例中使用call next方法,common-lisp,clos,Common Lisp,Clos,如果我有两个类,一个类父类和一个类子类 (定义父类() ...) (定义类子级(父级) ...) 我为initialize实例定义了两种不同的方法,但子方法接受另一个参数,并调用callnext方法 (defmethod初始化实例:在((实例父项)&键之后) ...) ; 做事 (defmethod初始化实例:在((实例子项)&键其他参数之后) 做事 (调用下一个方法) 我得到了错误 There is no next method for the generic function #<

如果我有两个类,一个类
父类
和一个类
子类

(定义父类()
...)
(定义类子级(父级)
...)
我为initialize实例定义了两种不同的方法,但子方法接受另一个参数,并调用
callnext方法

(defmethod初始化实例:在((实例父项)&键之后)
...) ; 做事
(defmethod初始化实例:在((实例子项)&键其他参数之后)
做事
(调用下一个方法)
我得到了错误

There is no next method for the generic function
#<STANDARD-METHOD COMMON-LISP:INITIALIZE-INSTANCE (93)>
when called from method
#<STANDARD-METHOD COMMON-LISP:INITIALIZE-INSTANCE :AFTER (CHILD) {...}>
with arguments
 ....

Condition of type SB-PCL::NO-NEXT-METHOD-ERROR
泛型函数没有下一个方法
#
从方法调用时
#
争论不休
....
SB-PCL类型的条件::无下一步方法错误

显然,我无法使用提供的参数调用下一个方法?

可能是因为您引用了文章中未提及的方法吗?错误消息提到一个
:after
方法。也许您可以启动一个新的sbcl实例并在那里重新创建类和方法,以确保相同的问题仍然存在

我试着在你的代码中填充空白,如下所示:

(defclass parent ()
  nil)

(defclass child (parent)
  nil)

(defmethod initialize-instance ((instance parent) &key)
  (format t "~&Init parent."))

(defmethod initialize-instance ((instance child) &key other-arg)
  (format t "Init child with ~a." other-arg)
  (call-next-method))

CL-USER> (make-instance 'parent)
Init parent.
#<PARENT {100390DEE3}>
CL-USER> (make-instance 'child)
Init child with NIL.
Init parent.
#<CHILD {100390AB93}>
CL-USER> (make-instance 'child :other-arg 'foo)
Init child with FOO.
Init parent.
#<CHILD {100396D253}>
(定义父类()
零)
(定义类子级(父级)
零)
(defmethod初始化实例((实例父项)&键)
(格式为t“~&Init parent.”)
(defmethod初始化实例((实例子项)&键入其他参数)
(格式为t“Init child,带~a.”其他参数)
(调用下一个方法)
CL-USER>(使实例成为“父实例”)
初始化父级。
#
CL-USER>(使实例成为“子实例”)
Init子级为零。
初始化父级。
#
CL-USER>(使实例'child:other arg'foo)
用FOO初始化child。
初始化父级。
#
以上内容在我的设置中似乎有效。

这对你有用吗?

可能是因为你引用了文章中没有提到的方法吗?错误消息提到一个
:after
方法。也许您可以启动一个新的sbcl实例并在那里重新创建类和方法,以确保相同的问题仍然存在

我试着在你的代码中填充空白,如下所示:

(defclass parent ()
  nil)

(defclass child (parent)
  nil)

(defmethod initialize-instance ((instance parent) &key)
  (format t "~&Init parent."))

(defmethod initialize-instance ((instance child) &key other-arg)
  (format t "Init child with ~a." other-arg)
  (call-next-method))

CL-USER> (make-instance 'parent)
Init parent.
#<PARENT {100390DEE3}>
CL-USER> (make-instance 'child)
Init child with NIL.
Init parent.
#<CHILD {100390AB93}>
CL-USER> (make-instance 'child :other-arg 'foo)
Init child with FOO.
Init parent.
#<CHILD {100396D253}>
(定义父类()
零)
(定义类子级(父级)
零)
(defmethod初始化实例((实例父项)&键)
(格式为t“~&Init parent.”)
(defmethod初始化实例((实例子项)&键入其他参数)
(格式为t“Init child,带~a.”其他参数)
(调用下一个方法)
CL-USER>(使实例成为“父实例”)
初始化父级。
#
CL-USER>(使实例成为“子实例”)
Init子级为零。
初始化父级。
#
CL-USER>(使实例'child:other arg'foo)
用FOO初始化child。
初始化父级。
#
以上内容在我的设置中似乎有效。

它对您有用吗?

在中,您正在使用的是,after方法没有next方法,因此
call next method
不能在其中使用:而是在方法组合以最特定的最后顺序调用所有方法之后才适用。允许您使用的
调用下一个方法
的位置是主方法和周围方法。

在中,这是您正在使用的,after方法没有next方法,因此
调用下一个方法
不能在其中使用:而是在方法组合以最特定的最后顺序调用所有方法后适用。允许您使用的
调用下一个方法
是主方法和周围方法。

这是一个玩具示例,我没有测试它。好吧,问题不在这里。我要编辑这个问题。我忘了在方法中添加:之后这是一个玩具示例,我没有测试它。好吧,问题不在这里。我要编辑这个问题。我忘了在方法中添加:after