Common lisp 专门研究向量和矩阵

Common lisp 专门研究向量和矩阵,common-lisp,clos,mop,generic-function,Common Lisp,Clos,Mop,Generic Function,我正在使用CommonLisp进行实时图形实验,到目前为止效果非常好。我对速度和与cffi的易兼容性的要求意味着我使用的是“类型化”数组。代码中有一个地方让人觉得很难看,那就是我的矩阵和向量数学函数的通用版本。由于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))

我正在使用CommonLisp进行实时图形实验,到目前为止效果非常好。我对速度和与cffi的易兼容性的要求意味着我使用的是“类型化”数组。代码中有一个地方让人觉得很难看,那就是我的矩阵和向量数学函数的通用版本。由于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实现的功能,但我最近看到了

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

我觉得您的代码很合适,您使用的是类型标记

(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***)

干杯,是的,它工作得很好,事实上,这是我在这里的一个老问题的方法。然而,问题更多的是关于MOP如何增加专业化方法的可能性当GF没有分派时,您为什么会使用CLO…抱歉,v+应该是defun而不是defmethod。除此之外,我认为我不理解你的问题v+是处理不同长度向量的通用方法,正如我在建议中对Menschen所说,它来自一个SO问题。我问这个问题的唯一原因是想知道MOP是否允许专门研究给定长度的数组。也许我应该删除问题的背景部分,因为这不是重点,只是一个用例的例子。使用CLOS和MOP只为三种向量类型编写函数没有什么意义。既然你提到了“速度”,我会使用可以内联的函数。如果我需要一些简短的方法来写这些东西,我会为此写一个宏……你说得对极了,我就这么做了。所有的核心向量库都是内联函数。然而,为了加快实验速度,我也有通用版本。它调用特定于长度的版本。我真的很感激你帮我找到了正确的方向。我想我应该把我的代码整理一下,然后把AMOP作为一个不相关的项目来阅读。这个问题现在看起来有点愚蠢。我真的需要去读书。谢谢大家的建议。