如何扩展Scala语法

时间:2013-06-05 15:40:44

标签: scala syntax

扩展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。

3 个答案:

答案 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