On Tue, Jun 29, 2004 at 05:31:29PM -0600, Luke Palmer wrote:

> Oh no!  Someone doesn't understand continuations!  How could this
> happen?!  :-)
> 
> You need two things to bring the state of the process back to an earlier
> state: undo and continuations.  People say continuations are like time
> traveling; I like to put it this way:
> 
> Say you're in the kitchen in front of the refrigerator, thinking about a
> sandwitch.  You take a continuation right there and stick it in your
> pocket.  Then you get some turkey and bread out of the refrigerator and
> make yourself a sandwitch, which is now sitting on the counter.  You
> invoke the continuation in your pocket, and you find yourself standing
> in front of the refrigerator again, thinking about a sandwitch.  But
> fortunately, there's a sandwitch on the counter, and all the materials
> used to make it are gone.  So you eat it. :-)

Urf.  Okay, put me on the list as "someone who thought he understood
continuations at least somewhat but obviously didn't have a clue."

I was under the impression that a continuation was the entire state of
the program at that point and that, when invoked, it overwrites the
current state with the saved one.  Therefore, if you invoke a
continuation, you are resetting everything to the when it was when the
continuation was taken.  So external changes (the fact that you wrote
to a file) will remain, but internal changes (the fact that you
assigned 7 to $foo) will be undone.  I'm not sure how some of the edge
cases (where things are partially internal and partially external) are
supposed to work out, for example:

      $dbh = connect_to_db_and_prepare_fetch_call();
      # save continuation here
      close_connection_to_db($dbh);
      # invoke saved continuation here
      $dbh->fetch_row();  # DB has closed connection so this fails.

Needless to say, I have never worked with continuations myself, just
studied them very briefly in college (a long time ago).


> A continuation doesn't save data.  It's just a closure that closes over
> the execution stack (and any lexicals associated with it; thus the "I
> want a sandwitch" thought).  If things change between the taking and
> invoking of the continuation, those things remain changed after
> invoking.

Well, at least that's a nice simple explanation.  Why couldn't anyone
have explained it to me that way before?  Unfortunately, it means that
continuations are a lot less useful than I thought they were.  :<

How do continuations and threads interact?  When you take a cont, are
you taking it only within the current thread?  Or does it snapshot all
threads in the process?

--Dks

Reply via email to