2013-05-10 6 views
5

Oto kilka fragmentów z mojego monitu Scala. Importuję interfejs API Reflect i próbuję reifikować niektóre wyrażenia, jak opisano w docs here.

scala> import scala.reflect.runtime.{universe => ru} 
scala> val str = "Duck I says." 

scala> ru.showRaw(ru.reify(println(2))) 
res40: String = Expr(Apply(Select(Select(This(newTypeName("scala")), 
    newTermName("Predef")), newTermName("println")), List(Literal(Constant(2))))) 

scala> ru.showRaw(ru.reify(str.length))  
res41: String = Expr(Apply(Select(Select(Select(Select(Select(Ident($line4), 
    newTermName("$read")), newTermName("$iw")), newTermName("$iw")), 
    newTermName("str")), newTermName("length")), List())) 

ja nie spodziewałem się zobaczyć te symbole, $read$line4 i $iw w drugim. Czym one są i dlaczego tam są?

Odpowiedz

5

val str ... w REPL faktycznie nie jest zmienną locale, ale właściwością jakiegoś obiektu. Zobacz this answer.

Wrap definicja zmiennej i reify wezwanie z bloku kodu tak:

{ 
    val str = ... 
    showRaw{reify {...}} 
} 
Powiązane problemy