专注于矢量和矩阵

Bag*_*ers 6 common-lisp clos generic-function mop

我正在使用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***)
Run Code Online (Sandbox Code Playgroud)

这有效,但感觉不对.我已经看到了各种CL实现的扩展,并听说了MOP的承诺.

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

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

Men*_*ein 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***)
Run Code Online (Sandbox Code Playgroud)