专注于矢量和矩阵

时间:2013-10-02 15:02:30

标签: common-lisp clos mop generic-function

我正在使用common-lisp进行实时图形实验,到目前为止它已经很棒了。我对速度的要求和与cffi的轻松兼容意味着我正在使用'typed'数组。代码中真正令人感到难看的一个区域是我的矩阵和矢量数学函数的泛型版本。由于CLOS无法专注于数组的长度,我正在做这样的事情:

(defun v+ (vec-a vec-b)
   (%v+ vec-a vec-b (length a) (length b)))

(defmethod %v+ (va vb (la (eql 3)) (lb (eql 3)))
   ***CODE HERE***)

这样可行,但感觉不是正确。我已经看到了各种CL实现的扩展,并听说了MOP的承诺。

我已经避开了这一点,因为我担心它会破坏某些CL实现的功能,但我最近看到了Closer-to-Mop project

核心问题: MOP是否提供了一种更有效的长度专业化方法?我应该关注哪些领域/技术?

1 个答案:

答案 0 :(得分:0)

您的代码适合我,您使用的是类型标记。

(defmethod v+ (vec-a vec-b)
   (labels ((find-tag (vec)
               (if (> (length vec) 3)
                   :more-than-3
                   :less-than-4)))
      (%v+ vec-a vec-b (find-tag a) (find-tag b)))

(defmethod %v+ (va vb (va-tag (eql :less-than-4)) (vb-tag (eql :less-than-4)))
   ***CODE HERE***)