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ı.
'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 –
, 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. –