2017-09-13 5 views
0

これは私が欲しいものです:Scalaのquasiquotes文字列変数リフティングは

scala> var x:Int = 10 
x: Int = 10 

scala> var y:Int = 20 
y: Int = 20 

scala> val ret = q"return $x>$y" 
ret: universe.Return = return 10.$greater(20) 

scala> val result1 = toolbox.compile(ret)() 
result1: Any = false 

しかし、問題は、私は

scala> m 
res20: String = $x>$y 
のように、文字列varに式$ x>の$ yを取得されるということです

そして私は

var ret = q"return $m" 

、などの操作を実行したいが、このリターン:

scala> var ret = q"return $m" 
ret: universe.Return = return "$x>$y" 

これは目的を果たさない。最後のステップでxとyの値を得るにはどうすればよいでしょうか$ xと$ y。

答えて

0

あなたはほとんどあなたが探しているもののような結果を達成するためにquasiquotesとToolBox.parseを混在させることができます:変数として自分の価値観を活かし

import scala.tools.reflect.ToolBox 
import scala.reflect.runtime.universe._ 

val toolbox = scala.reflect.runtime.currentMirror.mkToolBox() 

val s = "10>20" 
val ret = q"return ${toolbox.parse(s)}" 
// reflect.runtime.universe.Return = return 10.$greater(20) 
toolbox.eval(ret) 
// Any = false 

を:

import scala.tools.reflect.ToolBox 
import scala.reflect.runtime.universe._ 
val toolbox = scala.reflect.runtime.currentMirror.mkToolBox() 
val x = 10 
val y = 20 
val m = "x>y" 
val ret = q"return ${toolbox.parse(m)}" 
// reflect.runtime.universe.Return = return x.$greater(y) 

あなたがq"return ${toolbox.parse(m)}"を評価する場合に必要になりますxyは範囲外であるため、エラーを参照してください。返信用

import scala.tools.reflect.ToolBox 
import scala.reflect.runtime.universe._ 
val toolbox = scala.reflect.runtime.currentMirror.mkToolBox() 
val q1 = q"val x = 10; val y = 20; " 
val m = "x>y" 
val ret = q""" 
    | ..$q1 
    | return ${toolbox.parse(m)} 
    | """ 
toolbox.eval(ret) 
// Any = false 
+0

ありがとう:それを修正するには

scala> toolbox.eval(q"return ${toolbox.parse(m)}") scala.tools.reflect.ToolBoxError: reflective compilation has failed: object > is not a member of package x ... 

。私はもう一つ質問があります。この線: – Pankaj

関連する問題