Poniższe makro, pochodzących z większej przykład, ma stworzyć drzewo, ale nic z odniesieniem do this
:Jak odnosić się do załączania "to" w makro Scala?
def echoThisImpl(c:Context): c.Expr[Any] = {
import c.universe._
val selfTree = This(c.enclosingClass.symbol)
c.Expr[AnyRef](selfTree)
}
def echoThis: Any = macro CallMacro.echoThisImpl
Ale wezwanie do echoThis
takich jak
object Testing extends App {
val thisValue = CallMacro.echoThis
println(thisValue)
}
nie skompilować z komunikatem
[error] /home/rafael/dev/scala/goose/goose-macros/src/test/scala/Testing.scala:8: type mismatch;
[error] found : <noprefix>
[error] required: Any
[error] val thisValue = CallMacro.echoThis
Jeżeli ustawić -Ymacro-debug-Lite flaga wygenerowanego drzewa to This(newTermName("<local Testing>"))
.
Dzięki za odpowiedź Eugene. To nie wystarczyło, żeby mnie pokonać. IIUC 'c.prefix' jest wyrażeniem drzewa, które odnosi się do' obiektu', w którym zdefiniowane jest makro. –
(ciąg dalszy) 'This()' pobiera symbol i myślę, że szukam symbolu odnoszącego się do klasy otaczającej makro wywołania. Chcę wywołanie 'def echoThis: Wszelkie = makro MacroImpl.echoThis' być taka sama jak ' def echoThis: Wszelkie = this' –
Ok widzę. Pozwól mi pomyśleć: –