我遇到了一个问题,第三方库需要对一个类进行操作,就好像它已经完成一样。经过一番阅读,我了解了这种机制背后的动机,但我真的不知道它是如何运作的。
例子:
(make-instance 'expression :op '+ :left 'nan :right 'nan)
(defmethod normalize-expression ((this expression))
(optima:match this
((optima::or (expression :left 'nan) (expression :right 'nan)) 'nan)
((expression :op op :left x :right y) (funcall op x y))))
除非我添加第一行,否则该函数将无法编译,给我这个错误:
; caught ERROR:
; (during macroexpansion of (SB-PCL::%DEFMETHOD-EXPANDER NORMALIZE-EXPRESSION ...))
; SB-MOP:CLASS-SLOTS called on #<STANDARD-CLASS EXPRESSION>, which is not yet finalized.
; See also:
; AMOP, Generic Function SB-MOP:CLASS-SLOTS
optima
是一个模式匹配库,(expression :op op ...)
它将类的实例expression
与给定的模式匹配。我不知道很多细节,但看起来它需要知道为这个类定义的访问器是什么,而且看起来这些信息在最终确定之前是不可用的。那么,有没有办法回避最终确定的问题呢?
该课程不会被扩展(至少不会在这个项目中,也没有计划)。创建一个虚拟实例并没有那么大的伤害......这只是一个丑陋的解决方案,所以我希望找到一个更好的解决方案。另外,也许,我会得到更多关于定稿的信息,这也很好:)