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ć?
dlaczego byłoby użyć Clos gdy GF ma żadnego dyspozytorskich ... –
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
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 ... –