小编use*_*007的帖子

BoxedUnit与Scala中的单位

Scala中的BoxedUnit和Unit有什么区别?它们什么时候用作函数的返回类型?他们与REF的关系是什么?这是我在处理Unit时遇到的类型不匹配错误.

错误:java.lang.AssertionError:断言失败:无法从单元hello.scala中的UNIT转换为REF(类BoxedUnit) - 源码//Users/shiyu/Scala/FinalDataFlow/src/print/hello.scala,line- 347,偏移量= 13999

scala

13
推荐指数
1
解决办法
4873
查看次数

编写scala编译器插件时,如何为原始AST设置符号?

我正在使用一个scala编译器插件,该插件f(x)用块替换函数调用

{
val newvalue = f(x)
newvalue
}
Run Code Online (Sandbox Code Playgroud)

此块的值与相同f(x)

编译器插件在编译器阶段“ typer”之后立即工作,并通过用块的AST替换f(x)的AST进行上述转换。

在编译器阶段“ typer”之后执行此操作,新创建的块是未包含符号和类型的原始AST及其子AST。我需要调用localTyper来提供原始ASTs符号和类型。

val newVal = (ValDef(Modifiers(0), newTermName("newvalue"), TypeTree(a.tpe), a))
val newIdent = (Ident(newTermName("newvalue")))
localTyper.atOwner(parSymbol).typed(Block(List(newVal), newIdent))
Run Code Online (Sandbox Code Playgroud)

注意:a是函数调用“ f(x)newVal的AST ,是“ ” 的AST val newvalue = f(x)。并且newIdentnewvalue该块中对“ ” 的引用。parSymbol是旧版AST的所有者的符号“ f(x)”,或a

上面的代码在大多数情况下都能正常工作。但是,当在应用于函数“ f”的参数中有一些值的定义(无论是显式的还是隐式的)时,编译器都会发出错误。例如,我要转换:

object hello {

    def f(x : Unit) = {}

    def g =  f {
        try {  

        }
        catch {         
          case t …
Run Code Online (Sandbox Code Playgroud)

scala abstract-syntax-tree

5
推荐指数
0
解决办法
304
查看次数

有没有办法关闭Scala编译器的尾递归优化?

出于某些特殊原因,我想在大程序中删除所有@tailrec的效果,但是不想手动执行,编译时是否有任何可选参数可以关闭尾递归优化?我想在代码中留下@tailrec,但是不想检查它并在编译时进行尾递归优化.那可能吗?

scala tail-recursion

2
推荐指数
1
解决办法
415
查看次数