On Wed, 16 Feb 2005 09:18:42 -0600, [EMAIL PROTECTED] (Patrick R. Michaud) wrote: > On Wed, Feb 16, 2005 at 01:06:22PM +0000, Nigel Sandever wrote: > > > > Any chance that you could provide one or two simple but realistic examples of > > using Junctions and their operators? > > I'll give it a shot, but keep in mind that I'm somewhat new to this > also. :-) > > First, junctions are an easy way to represent the relationships > "any", "all", "one", or "none". So, where we once had to say: > > if ($x==$a or $x==$b or $x==$c or $x==$d) { ... } > > we can now say > > if $x == any($a, $b, $c, $d) { ... } > > Similarly, where we once had to say > > if (grep { $x == $^z } @list) { ... } > if (grep { $x == $^z } @list) == 0 { ... } > > > we can now say > > if $x == any(@list) { ... } > if $x == none(@list) { ... } >
I'd write the P5 none() case as if ( grep { $x != $_ } @list ) { ... } or unless( grep{ $x == $_ } @list ) { ... } which tends to reduce the sugaryness of the new syntax slightly. > And for fun, try writing the equivalent of > > if $x == one($a, $b, $c, $d) { ... } I'm also not entirely sure at this point whether that means if( grep( { $x == $_ } $a, $b, $c, $d ) == 1 ) { ... } or something different? > > without a junction. (Okay, one can cheat with C<grep>.) > But most of those examples pretty clear and understandable. I'm not sure that I see their convenience alone as a convincing arguement for the existance of Junctions. I keep thinking that there is something altogether more fundementally useful and ...well... cleverer underlying their inclusion, but at this stage I am not seeing it. In this usage, they appear to be replicating functionality that is already being provided via the inclusion of the hyper-operators. ('scuse me if I skip the unicode and/or get the syntax wrong!) if( $x ==<< @list ) { ... } ## any? if( $x !=<< @list ) { ... } ## none? if( ( $x ==<< @list ) == 1 ) { ... } ## one? if( ( $x ==<< @list ) == @list ) { ... } ## all? It would very much depend upon what a hyper operator returns in a boolean context, but they /could/ be made to work as I've indicated I think. If the hyper operator returned one boolean result for each comparison it made, and if a list of boolean values in a boolean context collapsed to a count of the trues/1s it contained, I think those would work. You would also get the bonus of if( ( $x ==<< @list ) == 2 ) { ... } ## two() ( three(), ten() etc. ) if( ( $x <=<< @list ) == @list/2 ) { ... } ## fify percent below... But I think the promise of Junctions appears to come from using them in conjunction with each other. $x = any( @list1 ); $y = all( @list2 ); $z = none( @list3 ); if( $x <= $y ) { ... } if( any( $x != $y ) or all( $y == $z ) ) { ... } except that I haven't got a clue what those mean? I've sat and starred at the worked examples given elsewhere in this and the other thread, and whilst I can follow how the results are derived when someone lays them out for me--though I fell into the trap of accepting the one where Damian made a mistake, which probably means I wasn't paying close enough attention--when I get to the the last line and see that the answer it true (or false), I look back at the original unexpanded statement and think: Yes! But what does it mean? When and where is that going to be useful? > > A programmer can easily use these without having to worry about the > notions of "autothreading" or "superpositions" or the like, and > their translations to English are fairly obvious. I suspect that > constructs like the above will be the majority of use for junctions. > > Things start to get "weirder" when we start storing junctions into > variables, and/or passing those variables/junctions into subroutines. > But I think this is not *too* far removed from the idea of placing a > subroutine or a rule into a scalar -- i.e., using a scalar to represent > something more than a single-valued primitive type. Thus, just as one > can write > > $x = new CGI; > $y = rule { \d+ }; > $z = sub { ... }; > > and then use $x, $y, and $z later on for an object, rule, and sub > (which may have a variety of side-effects associated with them), it makes > sense that one can write > > $w = any(@list); > > and then use $w to refer to the junction later. And a programmer who > does this is taking on some responsibility for understanding that $w > isn't one of the "trivial" scalars anymore (same as for $x, $y, and $z). > > However, one difference is that when one typically uses an object, rule, > or subroutine in a scalar there is some syntax that makes their nature > apparent. Some feel that Junctions might be just a bit "too magical" > in this respect (e.g., Luke has made some syntactic suggestions to try > make the existence/threading of a junction more apparent). > I see the dangers of scalars that aren't oridinary scalars--I also accept your premise that Junctions are no different from references in that regard. At this stage my "big question" is: What are they going to do for me? And whilst the simple examples show some syntatic sugaryness, I think that it will not be until I begin to see how to apply the more complex cases to real- world problems that I could reach a conclusion about whether the value of their inclusion outweights the onus of awareness the impose upon the programmer. > > Pm Regards. njs.