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 マクロはここでは役に立たないと思います... (もし間違っていたら訂正してください。Eugene は確かにこれをチェックします)
マクロは、型チェックされた AST にのみ適用できます(型チェックされた AST も生成します)。ここでの問題は、次の式です。
0 < x <= 3
次のように評価されます: (別の投稿を参照)
((0 < x) <= 3) // type error
にはそのような機能<=(i: Int)
はありませんBoolean
。
この式をコンパイルする方法がわかりません。したがって、マクロは無力です。
もちろん、カスタム クラスを使用して目標を達成することもできますが、マクロを使用しない場合 (必要に応じて例を挙げることができます)、可能な構文は次のようになります0 less x lesseq 3
。x between (0, 3)