1

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

4

3 回答 3

6

因为 Scala 中的 if-else 结构是一个表达式,所以您可以非常接近而无需任何扩展:

scala> val s = if (1 > 2) 3 else 4
s: Int = 4
于 2013-06-05T15:53:42.187 回答
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)
}
于 2013-06-05T17:14:19.890 回答
2

在 Scala 中,您可以用 if-else-construct 替换任何表达式:

val s = if (1 > 2) 3 else 4
于 2013-06-05T15:53:52.160 回答