相关疑难解决方法(0)

有没有办法在编译时测试常量是编译时常量?

鉴于知道算术final val表达式是否会被编译为编译时常量是多么困难,以及意外破坏编译时间是多么容易 ......

在编译时,有没有人能想到一种简单的方法来验证编译器是否实际上从一个复杂的算术表达式创建了一个编译时常量?我猜这可能是某种注释或宏,但也许有一些更简单的东西.例如,可能是这样的:

   @CompileTime final val HALF_INFINITY = Int.MaxValue / 2
Run Code Online (Sandbox Code Playgroud)

是可能的.

scala scala-macros

9
推荐指数
1
解决办法
1247
查看次数

Scala - 如何"延迟"表达式的编译

我一直想为Scala实现一个链式比较运算符,但经过几次尝试后,我认为没有办法实现它.这是它应该如何工作:

val a = 3
1 < a < 5 //yields true
3 < a < 5 //yields false
Run Code Online (Sandbox Code Playgroud)

问题是,scala编译器在计算表达式时非常贪婪,因此上面的表达式计算如下:

1 < a    //yields true
true < 5 //compilation error
Run Code Online (Sandbox Code Playgroud)

我试图编写代码以某种方式实现它,这是我尝试过的:

  • 从类型Int到我的类型的隐式转换RichComparisonInt- 由于上面的评估方式没有帮助,
  • 覆盖类Int我的同班同学-不能完成,因为Intabstractfinal,
  • 我尝试case class用名字创建<,就像::,但后来我发现,这个类只是为了模式匹配而创建的,
  • 我想创建隐式转换=> Boolean,它可以在编译级别上工作,但是没有办法提取操作的参数,从而导致Boolean结果.

有没有办法在Scala中做到这一点?也许宏可以完成这项工作?

scala scala-macros

5
推荐指数
1
解决办法
275
查看次数

标签 统计

scala ×2

scala-macros ×2