in reply to Re^2: my new article, "A Romp Through Infinity"
in thread my new article, "A Romp Through Infinity"

I'm afraid to dirty this thread too much more with my ramblings, but this is what I had in mind looks much like the syntax you presented. It's just that the adverbial part would come closer to the beginning so the programmer would start thinking about the special case before doing the comparison mentally.
if ( :authority<AKC> $name1 > $name2 ) { #... }
I'm not sure if just any bracket should be allowed, or if a special set should be necessary. The parsing for an infix operator could collect all the named parameters up front, though, starting from the opening of the context. It could continue until it sees the operator, then use the previous value and the following value as the operands/positional parameters.

With this:

if :authority<AKC> { $name1 > $name2 > $name3 } { # ... }
or this:
if :authority<AKC> { $name1 > $name2 && $name1 > 0 } { # ... }
the list of optional parameters could be used for every infix operator in the context.

Since Perl6 supports chained comparisons, the syntax you report is either ambiguous or cumbersome from what I can tell. Does this place both operators in the context:

if $name1 > $name2 > $name3 :authority<AKC> { #... }
or is this necessary:
if $name1 > $name2 :authority<AKC > $name3 :authority<AKC> { #... }
Furthermore, if you're comparing things does it even make sense that all the comparisons are not done in the same way? How often do you compare the EBCDIC ordinal for the letter 't' to the ASCII ordinal for 'd'? Who wants to know if the before-tax income of one employee is higher than the after-tax income of another? These things should be possible for the sake of flexibility in case someone really needs to do something requiring that. However, what's the syntax for that now? Is it even smart in that situation to connect the adverb to the verb instead of an adjective to the noun? If one needs two different contexts, they should be able to use methods on their objects to get the values. It only makes sense to use the adverbial form when they're all going to be in the same context.

This example has a bug in it if the latter syntax above is correct:

if $letter_1 > $letter_2 :lc > $letter_3 { # what if $letter_3 is a capital? }
That bug wouldn't be possible if the adverb controlled a block context.

Replies are listed 'Best First'.
Re^4: my new article, "A Romp Through Infinity"
by John M. Dlugosz (Monsignor) on Aug 07, 2008 at 10:02 UTC
    You would need a keyword or other syntactic marker, since a literal pair before anything else would not know its to be taken as an adverb.

    Larry said that :lc would refer to the single use of the operator only, not the whole chain. The parser just could not work to apply it to the whole chain. But putting it first somehow would avoid that problem, so I like the idea in general. Basically, establish the options in a lexical scope and then use the operators as many times as you want.

    For strings in particular, contextual variables might be good for controlling the default options. This is not a case of using different accessors -- you would want to compare strings using whatever rules rather than transforming (and copying) the whole string first. Especially when the comparison may decide after only a few characters, and not need to look at the whole string.

    In your last example, :lc won't do anything to the numeric comparison. You have a more serious bug of using > where you meant gt. —John