我想开发一个工具,一旦Scala编译器完成了所有繁重的工作,就会对scala程序进行后处理。根据我的理解,Scala编译器的不同阶段在语法糖和lambdas,闭包,模式匹配等高级功能方面逐步简化程序。但是,我注意到所谓的清理阶段 - 这是代码生成之前的最后阶段 - 看起来像scala,但它不是真正的scala。
有没有人知道或者可以指向一个可以帮助我理解清理阶段语言的资源?
举个例子,在清理阶段的输出中,我看到如下内容:
case <synthetic> val x1: Foo$Bar = l;
case9(){
if (...some condition...)
matchEnd8(scala.Predef.Set().empty())
else
case10()
};
我的假设是,这是翻译模式匹配的结果,但据我所知,它看起来不像有效的scala语法(我根本不是一位经验丰富的Scala开发人员!)。
我想这一切都归结为:是否有可能将清理阶段的输出转换为有效 - 可编译 - scala代码?
答案 0 :(得分:1)
通常,在scalac编译器的任何阶段(即使在解析之后),编译器使用的内部表示也不再是有效的Scala代码。这主要是因为您发现了标签和 gotos 的存在。
表格的结构
labelName(...params){
...
}
是标签定义,以及表单
的调用labelName(...args)
是跳转到该标签,将...args
分配给...params
。
scalac(和dotc,但具有不同的表示)使用标签和gotos来表示while
和do..while
循环(解析后立即),match
es的翻译尾递归优化函数。
通常,无法从内部表示返回到有效的Scala代码,特别是在管道中到目前为止cleanup
之后。