Hi Moritz >> a:b is the same as a..b (this is the easy part) >> >> a:b:c is a range from 'a' to 'b' by steps of 'c'. For example, 2:15:3 >> == 2,5,8,11,14 > > That can be done by giving the new infix:<:> operator list associativity > (niecza already supports this)
Can you explain or give me a link that explains how to do that? I can figure out a little bit on my own: multi sub infix:<:>( Int $a, Int $b ) { # This is the case 'a:b' } multi sub infix:<:>( Range $a, Int $b ) { # Is this correct? # I'm thinking that a:b:c could be interpreted as (a:b):c so it is "Range" : "Int". # Am I on the right track? } >> :b is the same as 0..b > > create a new prefix operator... except that that prefix : is already > taken for constructing pairs Ok. I hadn't realized that you could define the same symbol as prefix, infix and postfix... So.. ignoring the fact that : conflicts with existing syntax, I could do this: multi sub infix:<:>( Int $a, Int $b ) { ... } multi sub infix:<:>( Range $a, Int $b ) { ... } multi sub prefix:<:>( Int $a ) { ... } multi sub postfix:<:>( Int $b ) { ... } Right? >> : is the same as 0..Inf > > create a term:<:>. Ok. > There are hooks for all of that, but it requires you to come up with a > new syntax that doesn't collide heads-on with lots of existing grammar > rules. Thanks. I'll see if I think of something that feels natural but doesn't collide with anything. One option is to just use the existing .. operator: multi sub prefix:<..>( Int $b ) { 0..$b } multi sub postfix:<..>( Int $a ) { $a..Inf } Only problem is that something like "2..10..3" might be confusing. Hmm... I must have made a mistake here somewhere... After defining these functions, the traditional range '2..10' doesn't work anymore. I suppose that my new functions have a higher precedence than the traditional .. operator. I tried to fix this, but I failed: multi sub prefix:<..>( Int $b ) is looser(&infix:<cmp>) { 0..$b } So, I'm not doing this right. Cheers. Daniel. -- I'm not overweight, I'm undertall.