Re: Nondeterministic algorithms, flexops, and stuff

2002-10-30 Thread Jonathan Scott Duff
On Wed, Oct 30, 2002 at 04:03:55PM +, Piers Cawley wrote:
 Jonathan Scott Duff [EMAIL PROTECTED] writes:
  Hey, that's neat. Although it looks like it returns the $src when there
  isn't a path. You probably want it to return undef or something.
 
 Nah, it'll die when there isn't a path.

duh!  Of course.  I was too busy thinking about the recursion.

  Perhaps where you have die there should be something like
  $src.collapse or maybe just return undef.
 
 Well, traditionally you have 'fail' there, wants to be some kind of
 exception, but I'm not entirely sure of what the semantics should
 be.

In my very-non-exceptional programming, I'd want undef if there wasn't
a path.   So, I guess your code is just fine but needs a CATCH block
in there.  The superposition collapses when it finds a path or finds
that there is no path, no backtracking would be required.

-Scott
-- 
Jonathan Scott Duff
[EMAIL PROTECTED]



Re: Nondeterministic algorithms, flexops, and stuff

2002-10-30 Thread Piers Cawley
Jonathan Scott Duff [EMAIL PROTECTED] writes:

 On Wed, Oct 30, 2002 at 04:03:55PM +, Piers Cawley wrote:
 Jonathan Scott Duff [EMAIL PROTECTED] writes:
  Hey, that's neat. Although it looks like it returns the $src when there
  isn't a path. You probably want it to return undef or something.
 
 Nah, it'll die when there isn't a path.

 duh!  Of course.  I was too busy thinking about the recursion.

  Perhaps where you have die there should be something like
  $src.collapse or maybe just return undef.
 
 Well, traditionally you have 'fail' there, wants to be some kind of
 exception, but I'm not entirely sure of what the semantics should
 be.

 In my very-non-exceptional programming, I'd want undef if there wasn't
 a path.   So, I guess your code is just fine but needs a CATCH block
 in there.  The superposition collapses when it finds a path or finds
 that there is no path, no backtracking would be required.

Tell you what, here's a non flexop translation of the Lisp code I
borrowed my example from. Assume for a moment that Perl has
call_with_current_continuation (it should have *something* like it...)

  my @paths;

  sub choose(*@choices) {
fail unless @choices;
call_with_current_continuation - $cc {
  push @paths, sub { $cc( choose @choices[[EMAIL PROTECTED]] ) };
}
  }

  sub fail {
return Exhausted Choices but false unless @paths;
my $p1 = pop @choices;
$p1.();
  }

  sub descent($src, $dst) {
when $src == $dst { return $dst }
when !$src.kids   { fail }
otherwise { return $src, descent(choose($src.kids), $dst) }
  }

Actually, doing things this way allows one to control whether one
searchs depth or breadth first. For breadth first, just change the
'push' in choose to an unshift...
  

-- 
Piers

   It is a truth universally acknowledged that a language in
possession of a rich syntax must be in need of a rewrite.
 -- Jane Austen?