2012-12-04 11 views
5

Sadece böyle bir şey yapmak mümkün makro ve özellikle Clojure makro öğrenme ve ben merak ediyorum:Clojure var tanımlayan makro

(defmacro with-a=hello [f] 
    `(let [a "hello"] ~f)) 

(with-a=hello (println a)) 

Bu benim için değil çalışır ve atar hatası: CompilerException java.lang.RuntimeException: Can't let qualified name: user/a, compiling:(NO_SOURCE_PATH:1)

Şu an için, şemasının tanım tanım-sözdizimi bunun gibi bir şey yapmanıza izin verir, ancak bunun için clojure yolu var mı?

cevap

8

Varsayılan olarak sözdizimi alıntı formu `, adsız olmayan sembollerin ve sembol yakalamanın makrolarda eklenmesini engeller. Bunu kasıtlı olarak yaptığınızda, bir makroya nitelenmemiş bir sembol tanıtmak için ~' dizisini kullanabilirsiniz. Bu fantezi adı artgönderimsel makro var

(defmacro with-a=hello [f] 
    `(let [~'a "hello"] ~f)) 

user> (with-a=hello (println a)) 
hello 
nil 

makro

+4

O '~' 'herhangi bir özel sekans olmadığına dikkat etmek kullanışlı bir yöntem olmakla' ~ '(terk dizimi-alıntının hemen kombinasyonu) ve '' '(normal bir alıntı yapmaya başlar). – amalloy

+0

iyi nokta, teşekkürler :) –