HaloO Eric, you wrote:

#strictly outside ($a > 3..6) === (3 > $a > 6) === (3 > $a || $a > 6)## Advertising

Just looking at that hurts my head, how can $a be smaller than three and larger than 6? That doesn't make even a little since.

To my twisted brain it does ;) The idea is that outside === !inside === !($a < 3..6) === !(3 < $a < 6) === !(3 < $a && $a < 6) === !(3 < $a) || !($a < 6) # DeMorgan of booleans === 3 >= $a || $a >= 6 Well, stricture complicates the picture a bit. strictly outside === !strictly !inside that is also the case if comparison operators could be negated directly > === !<= === !( < || == ) === !< && != === >= && != We could write that as operator junctions infix:{'>'} ::= none( infix:{'<'}, infix:{'=='} ) infix:{'>='} ::= any( infix:{'>'}, infix:{'=='} )

($a > 3..6) === ($a < 3 || $a > 6)

I would write that ($a < 3 || 6 < $a) which is just the flipped version of my (3 > $a || $a > 6) and short circuit it to (3 > $a > 6). That makes doubled > and < sort of complementary orders when you think of the Nums as wrapping around from +Inf to -Inf. In fact the number line is the projection of the unit circle. In other words the range 6..3 might be considered as the inverse of 3..6, that is all real numbers outside of 3..6 not including 3 and 6.

Your intermediate step makes no sense at all. I would think that (and expect) ($a > 3..6) === ($a > 6); You could always use. my $range = 3..6; if ($range.min < $a < $range.max) == inside if ($range.min > $a || $a > $range.max) == outisde Then you don't have to warp any meaning of > or <, sure its longer but its obvious to anyone exactly what it means.

With Juerd's remark of using ~~ and !~ for insideness checking on ranges I think using < and <= to mean completely below and and > and >= meaning completely above in the order there remains to define what == and != should mean. My current idea is to let == mean on the boundary and != then obviuosly everything strictly inside or outside. But it might also be in the spirit of reals as used in maths to have no single Num $n beeing equal to any range but the zero measure range $n..$n. This makes two ranges equal if and only if their .min and .max are equal. This gives the set of 4 dualing pairs of ops < <= == ~~ >= > != !~ # negation of the above The driving force behind this real ranges thing is that I consider nums in general as coroutines iterating smaller and smaller intervalls around a limit. That actually is how reals are defined! And all math functions are just parametric versions of such number iterating subs. Writing programs that implement certain nums means adhering to a number

`of roles like Order which brings in < and > or Equal which requires ==`

`and != taken together also give <= and => and <=>. Finally, role Range`

brings in .., ~~ and !~ for insideness checking. Role Division is actually very interesting because there are just the 4 division algebras of the Reals, Complex, Quaternions and Octonions. Sorry, if this is all too far off-topic. --