2013-10-02 46 views
6

我使用共口齿不清我的实时图形实验,到目前为止,它已经是很大的。我对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是否提供了一种更有效的方法来专门研究长度?我应该关注哪些区域/技术?

+0

你为什么要使用CLOS当GF确实没有调度... –

+0

对不起V +应该已经defun定义,而不是defmethod。除此之外,我不认为我理解你的问题。 %V +是通用处理向量的各种长度为我评论到Menschenkindlein建议从SO质疑http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length来到。我问这个问题的唯一原因是找出MOP是否允许专门研究给定长度的数组。也许我应该删除问题的背景部分,因为它不是重点,只是一个用例的例子。 – Baggers

+2

使用CLOS和MOP为三种矢量类型编写函数是没有意义的。既然你提到'速度',我会使用可以内联的函数。如果我需要写这个东西的一些短的路,我会写一个宏是... –

回答

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***) 
+0

干杯,是它工作得很好,事实上它是从这里http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length我的老问题一个方法。然而,问题更多的是关于MOP如何增加专业化方法的可能性 – Baggers