有没有一种好方法可以让一个通用函数在列表的汽车上调度?
我一直在研究一个符号代数程序,目前我将大量数据存储为列表,其中包含不同的关键字作为car
表示类型的 s。例如,我将单纯形存储为'(:simplex #(0 1 2))
,并且我有一些我正在调用的步骤暂时存储为'(:step #(0 1 0 1))
。我希望能够获取这两者的维度和边界,理想情况下使用一些内置的调度机制。
有没有一种好方法可以让一个通用函数在列表的汽车上调度?
我一直在研究一个符号代数程序,目前我将大量数据存储为列表,其中包含不同的关键字作为car
表示类型的 s。例如,我将单纯形存储为'(:simplex #(0 1 2))
,并且我有一些我正在调用的步骤暂时存储为'(:step #(0 1 0 1))
。我希望能够获取这两者的维度和边界,理想情况下使用一些内置的调度机制。
有点老套,但你可以用eql
专家来做到这一点。
(defmethod foo ((first (eql :simplex)) (thing vector))
<method body here>)
然后,您必须将其称为
(foo :step #(0 1 0 1))
或者
(apply #'foo '(:step #(0 1 0 1)))
所以,对于你的情况,你会做类似的事情
(defmethod dimension ((type (eql :simplex)) (thing vector))
;; calculate dimension of a SIMPLEX here
)
(defmethod dimension ((type (eql :step)) (thing vector))
;; calculate dimension of a STEP here
)
和同样的boundary
。
如果你正在处理的东西真的是不同的结构,你可以考虑定义struct
s 或class
es 而不是使用原始列表。那时,您可以轻松地在适当的类型上定义方法,这样您就可以回避这种方法的尴尬调用要求。