2013-10-02 14 views
6

Ich benutze Common-Lisp für meine Echtzeit-Grafik-Experimente und bis jetzt ist es großartig. Meine Anforderungen an Geschwindigkeit und einfache Kompatibilität mit cffi bedeuten, dass ich "typisierte" Arrays verwende. Der eine Bereich des Codes, der sich wirklich hässlich anfühlt, sind die generischen Versionen meiner Matrix- und Vektorfunktionen. Als CLOS auf Länge eines Arrays spezialisieren kann ich nicht so etwas wie dies tue:Spezialisiert auf Vektoren und Matrizen

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

Das funktioniert aber fühlt sich nicht Recht. Ich habe Erweiterungen zu verschiedenen CL-Implementierungen gesehen und gehört, dass MOP versprochen wurde.

Ich habe davon abgelenkt, da ich befürchtete, dass es Funktionalität mit einigen CL-Implementierungen brechen würde, aber ich habe kürzlich die Closer-to-Mop project gesehen.

Kern Frage: Bietet MOP eine effizientere Methode für die Spezialisierung auf Länge? Gibt es Bereiche/Techniken, auf die ich mich konzentrieren sollte?

+0

Warum würden Sie CLOS verwenden, wenn die GF keine Dispatching ... –

+0

Sorry v + sollte defun anstatt defmethod gewesen sein. Ansonsten glaube ich nicht, dass ich deine Frage verstehe. % v + ist generisch, um die verschiedenen Längen des Vektors zu behandeln, wie ich zu Menschenkindlin kommentierte die Empfehlung kam von einer SO Frage http://StackOverflow.com/Questions/11996360/common-lisp-generic-function-specializing-on-array-length . Mein einziger Grund, dies zu fragen, besteht darin, herauszufinden, ob MOP es ermöglicht, sich auf ein Array mit einer bestimmten Länge zu spezialisieren. vielleicht sollte ich den Hintergrundbereich der Frage entfernen, da es nicht der Punkt ist, nur ein Beispiel für einen Anwendungsfall. – Baggers

+2

Es macht wenig Sinn, CLOS und das MOP zu verwenden, um Funktionen für nur drei Vektortypen zu schreiben. Da Sie "Geschwindigkeit" erwähnen, würde ich Funktionen verwenden, die inline sein können. Wenn ich eine kurze Art, dieses Zeug zu schreiben, brauchen würde, würde ich ein Makro dafür schreiben ... –

Antwort

0

Ihr Code fühlt sich für mich richtig an, und was Sie verwenden, ist Typ-Tagging.

(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

Prost, ja es funktioniert gut und in der Tat war es die Methode aus einer meiner alten Fragen hier http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length. Die Frage ist jedoch mehr darüber, wie MOP die Möglichkeiten in Bezug auf spezialisierte Methoden erhöht – Baggers

Verwandte Themen