【问题标题】:Common lisp CLOS dispatchCommon lisp CLOS 调度
【发布时间】:2014-07-21 16:14:56
【问题描述】:

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

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

【问题讨论】:

标签: common-lisp clos generic-function


【解决方案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 也是如此。

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

【讨论】:

  • 你可能指的是funcall而不是apply
  • @PauloMadeira - 不,我的意思是apply;他传入了一个列表,该列表的第一个元素是他想要调度的,第二个元素是他关心的向量。在 REPL 中试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多