2013-10-02 6 views
6

저는 실시간 그래픽 실험에 common-lisp을 사용하고 있으며 지금까지는 훌륭했습니다. 속도와 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 구현에서 기능이 중단 될 것을 두려워했지만이 부분을 벗어났습니다. 최근에는 Closer-to-Mop project을 보았습니다.

핵심 질문 : MOP는 길이를 전문으로하는보다 효율적인 방법을 제공합니까? 내가 집중해야 할 영역/기술이 있습니까?

+0

왜 GF가 디스패치를하지 않을 때 CLOS를 사용 하시겠습니까? –

+0

죄송합니다. v +는 defmethod가 아닌 defun이어야합니다. 그 외에는 당신의 질문을 이해할 수 없다고 생각합니다. % 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