gpt4 book ai didi

scala - 我可以从实时 Scala 代码中获取 AST 吗?

转载 作者:行者123 更新时间:2023-12-04 00:51:20 27 4
gpt4 key购买 nike

我说“实时代码”是因为我的意思不是来自文本源文件或源字符串,而是来自 partialFunctions/lambdas。 (我知道 Ruby1.8 的 parseTree 和 C# linq 可以做到)

考虑一个偏函数 f:

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

我希望有一些工具是这样的:
getBodyAstFrom(f) //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))

我不在乎语义(上下文解析和隐式太复杂,对我来说没有必要),我只需要来自实时代码的语法树,这可能吗?

检查其他人的代码可能会有问题,但是我自己的代码呢?下面的事情可能吗?
val f = AstFunction(i: Int, j: Int){(i + j) * 2}
f(5, 6) //=> 22
f.ast //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))

似乎需要对编译器进行一些黑客攻击,嗯...

最佳答案

编译器本身是一个库,您可以调用它。实际上,这就是 REPL 的工作方式。但是,虽然您可以获得一串代码的树(在不同阶段),但您无法获得已编译代码的树。

当然,除非您使用可以随时更改或不复存在的实验性内容。在这种情况下,您可以尝试:

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

并得到:
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)))))))

无论这是否有帮助...您可能需要查看 Miguel Garcia 的“ The Scala Compiler Corner”。

关于scala - 我可以从实时 Scala 代码中获取 AST 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1962925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com