扩展 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。
因为 Scala 中的 if-else 结构是一个表达式,所以您可以非常接近而无需任何扩展:
scala> val s = if (1 > 2) 3 else 4
s: Int = 4
正如其他海报所评论的那样,您应该用惯用的 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)
}
在 Scala 中,您可以用 if-else-construct 替换任何表达式:
val s = if (1 > 2) 3 else 4