Il s'agit d'un exemple simplifié, mais le problème reste le même.
Je souhaite y parvenir en utilisant des macros (pseudocode basé sur scala) :
(a: Int) => {
val z = "toShort"
a.z
}
Si je le réifie, j'obtiendrai quelque chose de semblable à ceci :
Function(
List(
ValDef(
Modifiers(Flag.PARAM),
newTermName("a"),
Ident(scala.Int),
EmptyTree
)
),
Block(
List(
ValDef(
Modifiers(),
newTermName("z"),
TypeTree(),
Literal(Constant("toShort"))
)
),
Apply(
Select(
Ident(newTermName("a")),
newTermName("toShort")
),
List()
)
)
)
Je ne sais pas comment accéder à une valeur et l'utiliser comme nom de terme.
J'ai essayé de remplacer newTermName("toShort")
con newTermName(c.Expr[String](Select(Ident(newTermName("z")))).splice)
mais le compilateur ne semble pas l'apprécier :
exception lors du macr java.lang.UnsupportedOperationException : la fonction que vous appelez n'a pas été épissée par > le compilateur. Cela signifie qu'une évaluation inter-étapes est impliquée et qu'elle doit être invoquée explicitement. si vous êtes sûr qu'il ne s'agit pas d'un oubli, ajoutez scala-compiler.jar au classpath, importer
scala.tools.reflect.Eval
et appeler<your expr>.eval
au lieu de cela.
J'ai également essayé 'eval' comme suggéré par le compilateur : newTermName(c.eval(c.Expr[String](...))
mais aucune n'a fonctionné.
Comment puis-je convertir un arbre comme Select(Ident(newTermName("z")))
(qui est un accès à la valeur d'une valeur locale) à a Nom une chaîne de caractères qui peut être utilisée comme paramètre pour newTermName
? Est-ce possible ?
UPDATE :
Voici le vrai problème qui vous est posé en tant que liste !
Merci d'avance,