On 2009-Aug-24, at 4:17 pm, Daniel Ruoso wrote:
Em Seg, 2009-08-24 às 23:50 +0200, Michael Zedeler escreveu:
The most elegant solution would be if the data types themselves
indicated their capabilities.
One thing I think you missed entirely is the fact that the infix:<..>
operator is a multi sub, so it falls to regular dispatch semantics,

But Michael's point was not about what's *possible*, but rather what's *reasonable*. Given that Ranges can act in two ways that lead to inconsistency, it would be less confusing to separate the list-kind from the interval-kind.

For certain discrete ordered types, like Int, both ways work out the same, and since Ints are the most common and most obvious use for Ranges, it's easy to overlook the confusion. The case with strings is a good example: it really doesn't make sense that a value not produced by a range nevertheless lies between its endpoints. Why not have a separate Interval type?

A Range might get implicitly cast to an Interval by using its endpoints; that leaves us open to the same confusion, although the context would help.
        # Assuming infix:<between> (Any, Interval)
        say 5 between [1, 10];
        say 5 between 1 .. 10;
        say 'aaa' ~~ 'aa' .. 'ba';      # false
        say 'aaa' between <aa ba>;      # true
        say 'aaa' between 'aa'..'ba';   # hm...

Come to think of it, the word "range" suggests ordering (like the related word "rank"), so perhaps Range is the right name for the interval-type, and "Series" should be the type that produces a series of values that may or may not have an innate ordering. (For example, you could produce a Complex series with: 5+5i .. 10+10i :by(1+1i).)


Reply via email to