扩展Scala语法的最佳方法是什么?例如,我想添加类似这样的东西(C ++):
int s = (1 > 2) ? 3 : 4;
或(Python)的:
var s = 0
if 1 < 4:
s = 3 + 5
else:
s = 8 - 9
print(s)
一般来说,我想添加一些有用的(对于我的任务)语法构造,我会像scalac插件一样实现它,但似乎插件只适用于AST。
答案 0 :(得分:6)
因为Scala中的if-else构造是一个表达式,所以你可以在没有任何扩展的情况下非常接近:
scala> val s = if (1 > 2) 3 else 4
s: Int = 4
答案 1 :(得分:3)
正如其他海报所评论的那样,你应该用惯用的Scala表达:
scala> Some(1) filter (_ > 2) map (_ => 3) getOrElse 4
res0: Int = 4
scala> Some(1) filter (_ < 2) map (_ => 3) getOrElse 4
res1: Int = 3
(由于有关语法的推文,请将其从ML中移除:)
冒号是有点采取的。这就是你正在尝试的摩擦。
我认为tribool必须像tribble一样发音。
package tribool
object Test extends App {
class TriBool[A](b: Boolean, a: =>A) {
def getOrElse[B >: A](other: =>B): B = this := other
def :=[B >: A](other: =>B) = if (b) a else other
}
// enhance Boolean with ?
implicit class TriBool_?(val b: Boolean) extends AnyVal {
def ?[A](a: =>A): TriBool[A] = new TriBool(b, a)
}
val s = (2 > 1) ? "higher" := "lower"
Console println s
def c = { println("eval c"); true }
def a = { println("eval a"); "yes" }
def b = { println("eval b"); "no" }
Console println (c ? a := b)
Console println (!c ? a := b)
}
答案 2 :(得分:2)
在Scala中,您可以用if-else-construct替换任何表达式:
val s = if (1 > 2) 3 else 4