Próbuję uzyskać oryginalny ciąg wejściowy parametru do makra, ale zwrócona pozycja wydaje się nieco wyłączona. Rozważmy to makro, na przykład:Co się dzieje z pozycją w makrach Scali?
object M {
import scala.reflect.macros.Context
import language.experimental.macros
def f[T](v: => T) = macro fImpl[T]
def fImpl[T : c.WeakTypeTag](c: Context)(v: c.Expr[T]): c.Expr[Unit] = {
import c.universe._
val pos = v.tree.pos
println(pos.lineContent)
println(" " * pos.column + "^")
println(" " * pos.point + "^")
c.literalUnit
}
}
Kiedy próbuję go z tego pliku:
object N extends App {
val x = 1
val y = 2
println(M.f(x + y))
}
uzyskać ten wynik:
println(M.f(x + y))
^
^
który nie ma sensu dla mnie. Spodziewam się, że wskaże on na x
, lub będzie wyłączony przez jeden. Co z tym?
Jeśli go zmienić na 'println (MF (x. + (Y)))) punkt przesuwa się o jeden do punktu na y, a za pomocą 'println (Mf (if (true) {x + y})) wskazuje na f, jeśli. Podejrzewam, że próbuje wskazać wierzchołek drzewa, inwokację + lub if, ale to, czy ma, czy nie, jest kolejnym pytaniem. Może również występować co najmniej jeden błąd typu "off-by-one". Wygląda to na stosowne dla zgłoszenia błędu. – wingedsubmariner
Byłoby śmieszniej, gdyby pytanie brzmiało: Jakie jest Twoje stanowisko w sprawie makr? –