1

有没有一种好方法可以让一个通用函数在列表的汽车上调度?

我一直在研究一个符号代数程序,目前我将大量数据存储为列表,其中包含不同的关键字作为car表示类型的 s。例如,我将单纯形存储为'(:simplex #(0 1 2)),并且我有一些我正在调用的步骤暂时存储为'(:step #(0 1 0 1))。我希望能够获取这两者的维度和边界,理想情况下使用一些内置的调度机制。

4

1 回答 1

3

有点老套,但你可以用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

如果你正在处理的东西真的是不同的结构,你可以考虑定义structs 或classes 而不是使用原始列表。那时,您可以轻松地在适当的类型上定义方法,这样您就可以回避这种方法的尴尬调用要求。

于 2014-07-21T17:26:15.483 回答