Question

J'ai dit « code en direct » parce que je veux dire pas de fichiers source de texte ou des chaînes de source, mais de partialFunctions / lambdas. (Je sais que C # et arbre syntaxique de LINQ de ruby1.8 peut le faire)

envisager une fonction partielle f:

val f = (i: Int, j: Int) => (i + j) * 2

J'espère que il y a un outil fonctionne comme ceci:

getBodyAstFrom(f) //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))

Je ne me soucie des choses sémantiques (contexte l'analyse et implicits sont trop complexes, et inutile pour moi), je dois juste l'arbre de syntaxe à partir du code en direct, est-il possible?

Il peut y avoir des problèmes avec l'inspection du code d'autres personnes, mais qu'en est mon propre code? Est-ce que les choses suivantes possible?

val f = AstFunction(i: Int, j: Int){(i + j) * 2}
f(5, 6) //=> 22
f.ast   //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))

Il semble avoir besoin de pirater le compilateur, hmmmm ...

Était-ce utile?

La solution

Le compilateur est lui-même une bibliothèque, que vous pouvez appeler. Voilà comment fonctionne REPL, en fait. Mais alors que vous pouvez obtenir l'arbre (à différents stades) pour une chaîne de code, vous ne pouvez pas l'obtenir pour le code compilé.

Sauf, bien sûr, si vous utilisez des choses expérimentales qui peuvent changer à tout moment ou tout simplement cesser d'exister. Dans ce cas, vous pouvez essayer:

scala.reflect.Code.lift(f).tree

Et obtenez:

res17: scala.reflect.Tree = Select(Select(Select(Ident(Field(line26$object,PrefixedType(ThisType(RootSymbol),Class(line26$object)))),Field($iw,PrefixedType(ThisType(Class(line26$object)),Class($iw)))),Field($iw,PrefixedType(ThisType(Class($iw)),Class($iw)))),Method(f,PolyType(List(),List(),AppliedType(PrefixedType(ThisType(Class(scala)),Class(scala.Function2)),List(PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int)))))))

Que cela aide ou non ... Vous pouvez consulter « Le compilateur Scala de Miguel Garcia coin ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top