Scala 不像 Python 那样提供链式比较:
// Python:
0 < x <= 3
// Scala:
0 < x && x <= 3
具有新宏功能的 Scala 2.10 是否会让程序员编写一个添加此功能的库?或者这超出了Scala 宏的范围?
宏似乎是实现此类语法糖的正确选择,因为它们不会使解析器/编译器复杂化。
Scala 不像 Python 那样提供链式比较:
// Python:
0 < x <= 3
// Scala:
0 < x && x <= 3
具有新宏功能的 Scala 2.10 是否会让程序员编写一个添加此功能的库?或者这超出了Scala 宏的范围?
宏似乎是实现此类语法糖的正确选择,因为它们不会使解析器/编译器复杂化。
你不需要宏:
class ChainedComparisons[T : Ordering](val res: Boolean, right: T) {
def <^ (next: T) = new ChainedComparisons(res && Ordering[T].lt(right, next), next)
def <=^ (next: T) = new ChainedComparisons(res && Ordering[T].lteq(right, next), next)
}
implicit def chainedComparisonsToBoolean(c: ChainedComparisons[_]) = c.res
class StartChainedComparisons[T : Ordering](left: T) {
def <^(right: T) = new ChainedComparisons(Ordering[T].lt(left, right), right)
def <=^(right: T) = new ChainedComparisons(Ordering[T].lteq(left, right), right)
}
implicit def toStartChainedComparisons[T : Ordering](left: T) = new StartChainedComparisons(left)
用法:
scala> val x = 2
x: Int = 2
scala> 1 <^ x : Boolean
res0: Boolean = true
scala> 1 <^ x <^ 3 : Boolean
res1: Boolean = true
scala> 1 <^ x <^ 2 : Boolean
res2: Boolean = false
scala> 1 <^ x <=^ 2 : Boolean
res3: Boolean = true
scala> if (1 <^ x <^ 3) println("true") else println(false)
true
scala> 1 <=^ 1 <^ 2 <=^ 5 <^ 10 : Boolean
res5: Boolean = true
我不认为 Scala 宏在这里会有所帮助......(如果我错了,请纠正我,尤金肯定会检查这个)
宏只能应用于经过类型检查的 AST(并且还可以生成经过类型检查的 AST)。这里的问题是表达式:
0 < x <= 3
将被评估为:(见另一篇文章)
((0 < x) <= 3) // type error
中没有这样的功能<=(i: Int)
。Boolean
我看不到让这个表达式编译的方法,因此宏是无能为力的。
当然你可以使用自定义类来实现你的目标,但是没有宏(如果需要我可以给你一个例子),一个可能的语法可以是0 less x lesseq 3
或x between (0, 3)