Rod Adams wrote:
> I would argue that this sort of relational comparison is of limited 
> usefulness. 

Well, except junctions hold more information than the simple comparisons
I've given here.  For example, a junction can have a value like:

    $x = ($a & $b) ^ ($c & $d)

which is true only if $a and $b are true or $c and $d are true but not
both.

> Invariably, the next question that will nearly always be 
> asked is "_Which_ values worked / didn't work?". 

If you're wanting to know *which* values worked, we still have C<grep> --
we don't need a special set notation for it, or to worry about junctions.

> so, where you say:
> if any(1,2,3,4) <= 3 {...}
> I would have a bit more complex:
> 
> if (1,2,3,4) & {$^a <=3} {...}

    if grep {$^a <= 3} (1,2,3,4) { ... }

> however, I could also say:
> 
> if ((1,2,3,4) & {$^a <=3}).elems > 2 {...}

    if (grep {$^a <= 3) (1,2,3,4)) > 2 { ... }

> for (1,2,3,4) & {$^a <=3} -> $a {   ...  }
> 
> Assuming that the {$^a <= 3} is some sort of meaningful threshold, one 
> would likely have defined a virtual set for it, so that becomes:
> 
> for (1,2,3,4) * #threshold -> $a {   ...  }

Ummm, out of curiosity, what would #threshold look like here?  

> [...] And how utterly impossible is it going to 
> be to debug a program that gets an inadvertent junction/set thrown in 
> somewhere. Like:
> 
> $x = $Value | 'Default';
>  instead of :
> $x = $Value || 'Default';

Hmm, this is an interesting point.  I'll let others chime in here,
as I don't have a good answer (nor am I at all authoritative on junctions).

> and((2,3,4) »<= 3)
> 
> btw, I like and()/or() over all()/any() because it makes it very clear 
> we are establishing a boolean context.

To me the fact that we're using <= establishes that we're interested
in a boolean result; I don't need "and/or" to indicate that.  Using
"and" to mean "all" doesn't quite work for me, as I somehow think of
"and" as a two-argument operation.

> [intersection]
> #foo * #bar   # and we even know which ones!
> 
> [containment]
> #foo <= #bar
> 
> [non-intersection]
> !(#foo * #bar)

Somehow overloading C<*> to mean "intersection" just doesn't work for
me here.  I'd have to think about it.

> But what happens when you try to escape the boolean context? I'll 
> reiterate my autothreading concerns above.
> And in these, you still have to do something completely different to 
> determine what the factors are.

...and we can still do those different things using grep and the
other list-context operations at our disposal.  

Ultimately I don't think I agree with the notion that sets and lists
are so different, or that sets deserve/require their own sigil.  
Certainly a list can be used to represent a set, and we can easily
define intersection/union/subset operations for lists, or else just
define a Set class and put the operations there.  Getting a list
to have unique values seems easy enough

    @xyz = all(@xyz).values();    # remove any duplicate elements of @xyz

so I'm not sure I see the need for a separate type.

Anyway, hopefully some others who have more experience than me on
this can chime in if appropriate.

Pm

Reply via email to