2013-10-02 30 views
6

Gerçek zamanlı grafik deneylerim için ortak lisp kullanıyorum ve şu ana kadar harika. Cffi ile hız ve kolay uyumluluk için gereksinimlerim 'yazılan' diziler kullanıyorum anlamına gelir. Gerçekten çirkin hissettiren kodun bir alanı, matrisimin ve vektör matematik işlevlerinin genel sürümleridir. CLOS Böyle bir şey yapıyorum bir dizinin uzunluğuna uzmanlaşmak olamaz gibi:Vektörler ve Matrisler Üzerinde Uzmanlaşma

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

Bu işler ancak sağ hissetmez. Çeşitli CL uygulamalarına uzantıları gördüm ve MOP'un sözünü duydum.

Bazı CL uygulamalarıyla işlevselliği bozacağından korktuğumdan bundan uzaklaştım ama daha yakın zamanda Closer-to-Mop project'u gördüm.

Core Soru: MOP, uzmanın uzmanlaşması için daha verimli bir yöntem sağlıyor mu? Üzerinde durmam gereken herhangi bir alan/teknik var mı?

+0

neden Clos kullanmak istiyorsunuz ... –

+0

üzgün v + ziyade defmethod daha defun gerekirdi. Bunun dışında ben senin sorunun ne olduğunu anlayamıyorum. % v +, Menschenkindlein'e yorum yaptığım gibi, çeşitli uzunluktaki vektörleri işlemek için genel bir sorundur http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length . Bunu sormamın tek nedeni, MOP'un belirli bir uzunlukta bir dizi üzerinde uzmanlaşmaya izin verip vermediğini bulmaktır. Belki de sorunun bir arka plan bölümünü çıkarmam gerekir, sadece bir örnek olayın örneği değildir. – Baggers

+2

Sadece üç vektör tipi için fonksiyon yazmak için CLOS ve MOP kullanmak pek mantıklı değil. 'Hız' bahsinden bu yana, belirtilebilecek işlevleri kullanacağım. Bu yazının kısa bir yoluna ihtiyacım olursa, bunun için bir makro yazabilirim ... –

cevap

0

Kodunuz benim için doğru ve ne kullandığınız tür etiketleme. GF hiçbir gönderilmesini yaptığında

(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

Şerefe, evet, gayet iyi çalışıyor ve buradaki eski sorularımdan bir tanesi http://stackoverflow.com/questions/11996360/common-lisp-generic-function-specializing-on-array-length. Bununla birlikte, soru MOP'un uzmanlaşma yöntemleriyle ilgili olasılıkları nasıl artırdığıyla ilgilidir. – Baggers

İlgili konular