2014-02-24 28 views
1

Context有方法literal(Int)literal(String)等。我如何創建給定名稱的文字符號(即'name)?有一個明顯的解決方法:創建Symbol.apply(literal(name)),但我希望應該有一個直接的方法。在宏中創建文字符號

回答

1

q"'sym"太明顯了嗎?

c.Expr[Any](q"'mysym") 

明顯,我的意思是,對不起,如果這顯然不是你的意思。

少方便,

c.Expr[Any](c.parse("'asym")) 

c.Expr[Any](c.parse(s"'$name")) 

也許痛苦,

c.Expr[Any](Apply(c.typeOf[scala.Symbol].typeSymbol, c.literal("mysym").tree)) 
+0

它應該是,但事實並非如此。除了name是一個變量,所以'q「'$ name」'。但是,如果不使用宏觀天堂,它看起來如何? –

+0

@AlexeyRomanov我認爲已編輯。從QQ回來真的很難。 –

1

在即將realeased 2.11你就可以只所享有符號成quasiquote得到毫不費力正確的樹:

val s: scala.Symbol = 'foo 
q"$s" // q"'foo" 

這應該工作在2.10與macro paradise plugin以及。