有没有一个好方法可以让泛型函数在列表的汽车上分派?
我一直在做一个符号代数程序,目前我将大量数据存储为列表,并使用不同的关键字作为car来指示类型。例如,我有一些简单存储为'(:simplex #(0 1 2)),还有一些我暂时称之为steps的东西存储为'(:step #(0 1 0 1))。我希望能够使用这两者的维度和边界,理想情况下使用一些内置的分派机制。
发布于 2014-07-22 01:26:15
有点老生常谈,但您可以使用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或classes,而不是使用原始列表。在这一点上,您可以很容易地在适当的类型上定义方法,这将使您避开这种方法的笨拙的调用要求。
https://stackoverflow.com/questions/24869775
复制相似问题