HaloO Everybody, here's a an idea from me about makeing range object a bit like junctions. That is a range object has a $.min and $.max and the following comparison behaviour:
str num lt < strictly inside ---------+ gt > strictly outside ------+ | eq == exactly on boundary --+ | | | | | negation ne != not on boundary --+ | | le <= inside or on boundary --+ | ge >= outside or on boundary ---+ # strictly inside ($a < 3..6) === (3 < $a < 6) === (3 < $a && $a < 6) #strictly outside ($a > 3..6) === (3 > $a > 6) === (3 > $a || $a > 6) # inside or boundary ($a <= 3..6) === (3 <= $a <= 6) === (3 <= $a && $a <= 6) # outside or boundary ($a >= 3..6) === (3 >= $a >= 6) === (3 >= $a || $a >= 6) Please note what light the comaprisons sheds on chained comparison in general! The driving idea is to make the .. range not a list constructing operator but a real uncountably infinite set of reals bounded by the two nums. The measure of the interval always beeing the difference. +(3..7) == 7 - 3 == 4 Such a range might be interated of course. But only if the stepping is given. Well, a range might be subdivided into subranges. But I'm unsure what the default number of sections should be---10 perhaps? (3..7) == (3..4..5..6..7) # array/list of subranges [0][1][2][3] (3..7)[2] == 5..6 (3..7).split(10) == # or perhaps (3..7)/10 returning a list (3.0..3.4..3.8..4.2..4.6..5.0..5.4..5.8..6.2..6.6..7.0) [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [-10][-9] [-8] [-7] [-6] [-5] [-4] [-3] [-2] [-1] # step = (7-3)/10 = 0.4 Driving it even further we get closure bounded ranges. Here is a circle with radius 5: my Point $p = ( x => 2, y => 3); $circle = $p..{ (.x - self.min.x)**2 +(.y - self.min.y)**2 <= 5**2 }; The self is the range and .x and .y are applied to $_ when it comes to inside checking as in if $some_point < $circle { ... } I'm not sure how usefull this numerics inspired idea fits into Perl6. The former meaning of .. constructing a list could be implemented with ,, and ;; as follows. + ^5 == +(0,1,2,3,4) == 5 +(3,,7) == +(3,4,5,6,7) == 5 The mnemonic is that the ,, is just filling the left out parts by iterating, indicated by parens here: +(1,,5,5,,8) == +(1,(2,3,4),5,5,(6,7),8) == 7 Note the duplicated 5 which was there before expansion. Left out ends default to 0 naturally: (,,7) == ( 0,, 7) == ( 0, 1, 2, 3, 4, 5, 6, 7) (7,,) == ( 7,, 0) == ( 7, 6, 5, 4, 3, 2, 1, 0) (,,-7) == ( 0,,-7) == ( 0,-1,-2,-3,-4,-5,-6,-7) (-7,,) == (-7,, 0) == (-7,-6,-5,-4,-3,-2,-1, 0) But counting over zero doesn't duplicate the 0 of course: (-3,,3) == (-3,-2,-1, 0, 1, 2, 3) Here are some ideas how to extend to semicolon list: +(1,2 ;; 3,4) == +(1,2,3 ; 2,3,4) == 2 * 3 == 6 +(1;1 ;; 3;3) == +( (1;1),(1;2),(1;3), (2;1),(2;2),(2;3), (3;1),(3;2),(3;3) ) == 9 Combining , and .. gives +(1..5,5..8) == 2 # List of Range not a list from 1 to 8 or so. Comments? --