In short: I try to write something like A <N B for a DSL in Scala, for an integer N and A,B of Type T. Is there a nice possibility to do so?
Longer: I try to write a DSL for TGrep2 in Scala. I'm currently interested to write
A <N B B is the Nth child of A (the rst child is <1). in a nice way and as close as possible to the original definition in Scala. Is there a way to overload the < Operator that it can take a N and a B as a argument.
What I tried: I tried two different possibilities which did not make me very happy:
scala> val N = 10 N: Int = 10 scala> case class T(n:String) {def <(i:Int,j:T) = println("huray!")} defined class T scala> T("foo").<(N,T("bar")) huray! and
scala> case class T(n:String) {def <(i:Int) = new {def apply(j:T) = println("huray!")}} defined class T scala> (T("foo")<N)(T("bar")) warning: there were 1 feature warnings; re-run with -feature for details huray!
nthinstead of the<symbol which makes the semantics clear.A nth N is Bwould make a lot of sense to me at least.foo.bar(baz)to becomefoo bar baz, but it doesn't apply to functions with multiple arguments. You'll want to re-think your DSL so that your statement is more likefoo.bar(baz).bang(biff)(A nth N is B)