2013-10-02 15 views
6

Używam zwykłych selekcji do moich eksperymentów graficznych w czasie rzeczywistym i jak dotąd jest on świetny. Moje wymagania dotyczące szybkości i łatwej zgodności z cffi oznaczają, że używam tablic "typowanych". Jedynym obszarem kodu, który naprawdę wydaje się brzydki, są generyczne wersje funkcji matematycznych i wektorowych funkcji matematycznych. Jak CLOS cant specjalizują się na długości tablicy robię coś takiego:Specjalizuję się w wektorach i matrycach

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

To działa, ale nie czuje prawo. Widziałem rozszerzenia różnych implementacji CL i słyszałem o obietnicy MOP.

Odsunąłem się od tego, ponieważ obawiałem się, że zepsułoby to funkcjonalność w niektórych implementacjach CL, ale ostatnio widziałem już Closer-to-Mop project.

Pytanie podstawowe: Czy MOP zapewnia bardziej skuteczną metodę specjalizacji na długość? Czy jest jakiś obszar/techniki, na których powinienem się skupić?

+0

dlaczego byłoby użyć Clos gdy GF ma żadnego dyspozytorskich ... –

+0

przykro v + powinien zostały defun zamiast defmethod. Poza tym nie sądzę, że rozumiem twoje pytanie. % v + jest generyczny, aby obsłużyć różne długości wektora, jak to skomentowałem do Menschenkindle w zaleceniu pochodzi z pytania SO http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length . Jedynym powodem, dla którego o to pytam, jest sprawdzenie, czy MOP pozwala na wyspecjalizowanie się w tablicy o określonej długości. może powinienem usunąć sekcję tła pytania, ponieważ nie jest to kwestia, tylko przykład użycia. – Baggers

+2

Nie ma sensu używać CLOS i MOP do pisania funkcji tylko dla trzech typów wektorów. Ponieważ wspomniałeś o "prędkości", użyłbym funkcji, które można wstawić. Gdybym potrzebował jakiegoś krótkiego sposobu pisania tego, napisałbym makro do tego ... –

Odpowiedz

0

Twój kod jest dla mnie odpowiedni i używasz tagowania typu.

(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

Pozdrowienia, tak to działa dobrze i w rzeczywistości była to metoda z jednego z moich starych pytań tutaj http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length. Jednak pytanie dotyczy raczej tego, w jaki sposób MOP zwiększa możliwości w zakresie metod specjalizacyjnych – Baggers

Powiązane problemy