2014-02-24 31 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以及。