Em Dom, 2009-03-29 às 22:57 -0700, Mark Lentczner escreveu:
> What I see here is that there is a tendency to want to think about,  
> and operate on, the eigenstates as a Set, but this seems to destroy  
> the "single value" impersonation of the Junction.
> Further, if one ever calls .!eigenstates() on a Junction, then you  
> have really bollox'd your code up, as then this code fails if the  
> value you thought was a Junction happens to be, actually, just a  
> single value!  (Unless .!eigenstates() is defined on Object, and  
> returns a Set of self...)

++

This is the most important semantic deadlock, thanks for putting it so
clearly.

> I think what is needed is a "single value" threshing function, which  
> can be applied to, well, single values.  Such a function would take a  
> value and a predicate, and if the predicate applied to the value is  
> true, returns the value, else it returns... nothing. If such a  
> function were applied to a Junction, then the result would be a  
> Junction of just those those eigenstates that "passed" this function.   
> The "nothings" would not end up contributing to the Junction.

Well, that can be thought as grep. 

my @i = 1|11, 9, 1|11;
my @j = 6,9,6;
my $a = [+] @i;
my $b = [+] @j;
my $va = $a.grep: * <= 21;
my $vb = $b.grep: * <= 21;
if ($va && $vb) {
   if ($va > $vb) {
      # a wins
   } elsif ($vb > $va) {
      # b wins
   } else {
      # draw
   }
}

If we have grep as a method in Any, the call to grep will autothread,
returning a junction of the values, so, as $a is any(11, 21, 31), $va
would be any(11,21,()), which should collapse as expected.

> Now, I'm not sure I know how to return "nothing" in Perl6, but I'll  
> guess that undef can serve the purpose, since I can't think of a  
> useful use of undef as part of a Junction.

Well, you return nothing simply by calling "return;" it will produce an
empty capture, which could be seen simply as ().

daniel

Reply via email to