I think $a <= $^x <= $b is short enough, and lets you choose between < and <= on both ends and without having to remember how many dots each maps to.
But I do like your "list context for list behavior" idea. I would support that happily. On 8/27/09, Jon Lang <datawea...@gmail.com> wrote: > smuj wrote: >> TSa wrote: >>> >>> HaloO, >>> >>> David Green wrote: >>>> >>>> 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? >>> >>> I see no problem when a Range matches for values which are not produced >>> by a RangeIterator. I expect 2.5 ~~ 1..5 to be true even though 2.5 is >>> not in 1,2,3,4,5. >> >> I suspect that the double meaning of Ranges is going to confuse some >> people >> and bite others. If things stay as they are, I hope that the use of :by >> will >> be flagged as a syntax error if used in literal Range smart matching. Of >> course, that doesn't help the unsuspecting when variables are being used, >> ala 2.5 ~~ $myrange. > > Another possibility is that literal Range smartmatching works as is in > the absence of :by (that is, with a Range), but becomes a set > membership test in its presence (i.e., with a RangeIterator). Or not; > see below. > >> (For the record, 2.5 ~~ '!'..5 is also true on my system, although I don't >> know why! I certainly wouldn't expect it though :) > > One explanation would be that it's comparing the String "2.5" to the > String-terminated Range "!".."5". Since "2" falls between "!" and > "5", so does "2.5". > >>> The same applies for 'aaa' ~~ 'aa'..'az'. I find this >>> quite natural. >> >> Not sure if you're saying that's something you'd like or if you think that >> that's something already there. It doesn't match for me using recent(ish) >> Rakudo. Of course, that could just be me! :) >> >> I'd personally prefer it if Ranges just did lists, including when smart >> matching, but had an interval method or such like for explicit matching >> against the endpoints, e.g. >> >> 2.5 ~~ interval(1..5) # or >> 2.5 ~~ $myrange.interval > > I don't like the Huffman encoding: "does $x come after $a and before > $b?" is a common test, and so should be short. I'd rather require you > to force it into list context if your goal is to test for set > membership. In fact, that might be a clean way of handling its dual > nature: in item context, it behaves as a Range object; in list > context, it behaves as the RangeIterator. So: > > 2.5 ~~ 1..5 # true: equivalent to "2.5 ~~ 1 <= $_ <= 5". > 2.5 ~~ @(1..5) # false: equivalent to "2.5 ~~ (1, 2, 3, 4, 5)". > > Incidently, this first example is why I think that Range is intimately > related to the various order-related operators, and in particular > before and after: its most common use outside of generating sequential > lists is to provide a shorthand for "$min before $_ before $max" and > similar range-testing expressions. > > -- > Jonathan "Dataweaver" Lang > -- Sent from my mobile device Mark J. Reed <markjr...@gmail.com>