2013-10-02 22 views
6

Sto usando common-lisp per i miei esperimenti di grafica in tempo reale e finora è stato fantastico. I miei requisiti per la velocità e la facile compatibilità con cffi significano che utilizzo gli array "tipizzati". L'unica area del codice che sembra davvero brutta sono le versioni generiche delle mie funzioni matematiche di matrice e vettori. Come CLOS sopraelevazione specializziamo in lunghezza di un array che sto facendo qualcosa di simile:Specializzato su vettori e matrici

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

Questo funziona, ma non si sente destra. Ho visto estensioni a varie implementazioni di CL e ho sentito parlare della promessa di MOP.

Mi sono allontanato da questo perché temevo che avrebbe interrotto la funzionalità con alcune implementazioni di CL, ma recentemente ho visto lo Closer-to-Mop project.

Domanda principale: MOP fornisce un metodo più efficiente per la specializzazione su lunghezza? Ci sono aree/tecniche su cui dovrei concentrarmi?

+0

perché si utilizzare CLOS quando il GF non fa dispacciamento ... –

+0

dispiace v + avrebbe dovuto essere defun piuttosto che defmethod. A parte questo, non penso di capire la tua domanda. % v + è generico per gestire le varie lunghezze del vettore come ho commentato a Menschenkindlein la raccomandazione proviene da una domanda SO http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length . La mia unica ragione per chiedere questo è scoprire se MOP consente di specializzarsi su un array di una determinata lunghezza. forse dovrei rimuovere la sezione di sfondo della domanda in quanto non è il punto, solo un esempio di un caso d'uso. – Baggers

+2

Non ha molto senso usare CLOS e il MOP per scrivere funzioni per soli tre tipi di vettore. Dal momento che dici "velocità", userei le funzioni che possono essere sottolineate. Se avessi bisogno di un modo breve per scrivere questa roba, scriverei una macro per quello ... –

risposta

0

Il tuo codice è giusto per me e quello che stai utilizzando è il tagging del tipo.

(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

Cheers, sì funziona bene e in effetti era il metodo di una delle mie vecchie domande qui http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length. Tuttavia, la domanda è più su come MOP aumenta le possibilità per quanto riguarda i metodi di specializzazione – Baggers