2011-09-05 44 views
6

Clojure'da bir dizi basit "def" ifadesinin değerlendirilmesine izin veren bir makro yazmaya çalışıyorum. Makrolara gelince bir n00b'yim. FikirMakronun içinden geçiş Döngü

(my-defs y1 1 
    y2 "taco") 

(do (def y1 1) (def y2 "taco")) 

Aşağıdaki kod iki Defs

güzel
(defmacro my-defs 
    [& args] 
    `(do 
    (def ~(first args) ~(second args)) 
    (def ~(nth args 2) ~(nth args 3)))) 

özel durum için bunu gerçekleştirir genişleyecektir gerektiğidir; ama sıkıntı genelleme yaşıyorum bu. Ben (partition 2 args) elemanlarının bağları ile ilmek kapsayan birkaç naif şeyler denedim ama her zaman çöp var (Bu çok özel değil biliyorum ama çöpün çeşitliliği ve kapsamı burada rapor çok fazla görünüyordu). Bunları nasıl çözerim ve kusurlarımı nasıl değerlendiririm?

P.S. Makro my-defs oyuncaktır. Sonunda gerçekten gerçekleştirmek istediğim bir grup multimethod örneğini başlatmak için bir littel yardımcı makrodur. Şu anda, biraz çirkin olan

gibi görünen büyük kod parçaları var. Bunun yerine

(defmethods f 
    [A B] [x] "AB" 
    [A A] [x] "AA" 
    [C B] [x] "CB") 

gibi bir şey yapıp yapamayacağımı iyi olurdu.

cevap

5

Bana ~ @ makro genişletme/unquote'u aradığınız gibi görünüyor.

(defmacro defmethods [n & defs] 
    `(do [email protected](map (fn [[a1 a2 a3]] 
        `(def ~n ~a1 ~a2 ~a3)) 
       (partition 3 defs)))) 
+0

Teşekkürler, şimdi defmetrelerimi şimdi yazdım! –

+1

Sanırım bu şablonun yazılması daha kolay '' (cons 'do ([[xyz] (bölüm 3 args) için] ...) veya '\' (do ~ @ (for ...)) \' Harita şeyler akışını bozar ve bir backquote ve '~ @' sadece bir kod elde etmek için kodun kafa karıştırıcı görünmesini sağlar – amalloy

+0

@ amalloy. İpucu için teşekkürler (do ~ @ (for ...)) daha iyi görünüyor. –