2016-10-26 6 views
1

残念ながら準クォートへの挿入値、最も直感的な方法、スカラ -

Error:(16, 36) Don't know how to unquote here 
val tree = q"""println("Hello $world")""" 
        ^

val world = "Earth" 
val tree = q"""println("Hello $world")""" 

結果quasiquotes内$treeを期待しているため。

val world = "Earth" 
val tree = q"""println(${c.literal(s"Hello $world")})""" 

作品、非常に醜いと私はc.literalは廃止され、私が代わりに、quasiquotesを使用する必要があることのIntelliJ警告が表示されます。

...どうすればいいですか?フラウィウスさんのコメントに応えて

UPDATE

import scala.language.experimental.macros 
import scala.reflect.macros._ 

object TestMacros { 

    def doTest() = macro impl 

    def impl(c: blackbox.Context)(): c.Expr[Unit] = { 
    import c.universe._ //access to AST classes 
    /* 
    val world = "Earth" 
    val tree = q"""println(${c.literal(s"Hello $world")})""" 
    */ 

    val world = TermName("Earth") 
    val tree = q"""println("Hello $world")""" 

    tree match { 
     case q"""println("Hello Earth")""" => println("succeeded") 
     case _ => c.abort(c.enclosingPosition, s"huh? was: $tree") 
    } 

    c.Expr(tree) //wrap tree and tag with its type 
    } 
} 

はあなたがTermNameまたはコンパイラプリミティブ何かを必要とする

Error:(18, 40) Don't know how to unquote here 
    val tree = q"""println("Hello $world")""" 
           ^

答えて

5

を与えます。

現実の問題は、インターポレータを混在させていることです。こんにちは世界の補間器は文字列補間器ですが、あなたが示唆しているように、引用符のついていない木には良いquasiquoteではありません。

これはそれについて移動する一つの方法です:「世界ハロー内補間が実際に文字列補間ではなく、準クォート一つです」にあなたは手の込んだことができ

import c.universe._ 

val world = TermName("Earth") 
val tree = q"""println("Hello" + ${world.decodedName.toString})""" 
+0

? – User1291

+0

また、あなたが仕事を提案する2つの方法のどちらもコンパイラは "世界"が彼には知られていないと不平を言うだろう、第二に、彼はそれを引用する方法を知らないと不平を言うだろう。 – User1291

+0

私は答える前にテストしました、あなたは何かをやっていて、おそらく間違っています。使用しているスカラのバージョンは何ですか? – flavian