2016-10-02 39 views
5

bir makro içinde ifadelerden bina ifadeleri oldu bu soru builds off of a previous SO question iç bir ifadesi haline bir ifade Interpolating. Ancak, tüm ifadeyi alıntılarken bazı şeyler küçük bir kamyoncu aldı. Örneğin, şu ifadeyi oluşturmak istiyorum: (name = val). Aşağıdaki: dışarıbir alıntı

:x 
Expr 
$(Expr(:quote, 5)) 
Expr 

macro quotetest(name,val) 
    quote 
    nm = Meta.quot($(QuoteNode(name))) 
    v = Meta.quot($(QuoteNode(val))) 
    println(nm); println(typeof(nm)) 
    println(v); println(typeof(val)) 
    end 
end 

@quotetest x 5 # Test case: build :(x=5) 

baskılar Ben doğru yolda olduğumu gösteriyor: nm ve val ben alıntı içeride istediğiniz ifadelerdir. Ancak, bu noktada bir önceki çözümü uygulayamıyorum. Örneğin,

macro quotetest(name,val) 
    quote 
    nm = Meta.quot($(QuoteNode(name))) 
    v = Meta.quot($(QuoteNode(val))) 
    println(nm); println(typeof(nm)) 
    println(v); println(typeof(v)) 
    println(:($(Expr(:(=),$(QuoteNode(nm)),$(QuoteNode(val)))))) 
    end 
end 

nm is not defined söyleyerek başarısız olur. Sadece o ifadeyi kurmak yapmak için öğrenmek gibi olamaz vb interpolasyon $(esc(nm)) kaçan, QuoteNode olmadan interpolating çalıştı.

+1

'makro qtest (isim, val): (Expr (: (=), $ (Meta.quot (isim)), $ (Meta.quot (val)))) Sonu '. Bu istenen ifadeyi döndürüyor mu? Söz konusu alıntı yuvalama (daha sonra 'quote' sonra' quot' ':() gerekenden daha yüksek görünüyor' ardından 'QuoteNode' ... Bazı' $ 'ler biberli ile). doğrudan ifadesini bina gösterilen basit durum için işe yararken –

+0

, genelleme yapmak çok daha zordur. Sen repl çalışmak ve test etmek kolay olacak ve ardından alıntı ve her şeyi doğru enterpolasyonlayarak fonksiyonları çalışır bir şey haline dönecek bir çıktı üreten bir makro oluşturabilirsiniz. Bunu, büyük bir ifadeyi aşamalı olarak inşa etmekten çok daha kolay buluyorum. –

cevap

4

Ben size gerekenden daha fazla $ işaretleri kullanılarak düşünüyorum. Aradığın şey bu mu?

julia> macro quotetest(name,val) 
      quote 
       expr = :($$(QuoteNode(name)) = $$(QuoteNode(val))) 
       println(expr) 
       display(expr) 
       println(typeof(expr)) 
      end 
     end 
@quotetest (macro with 1 method) 

julia> @quotetest test 1 
test = 1 
:(test = 1) 
Expr