guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Non-stack-copying call-with-current-continuation?


From: David Kastrup
Subject: Non-stack-copying call-with-current-continuation?
Date: Fri, 02 Mar 2012 01:00:43 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.92 (gnu/linux)

Hi,

I am just meddling around with coding and have come up with the
following:

(define-public (find-child music predicate)
  "Find the first node in @var{music} that satisfies @var{predicate}."
  (catch 'music-found
         (lambda ()
           (fold-some-music predicate
                            (lambda (music . _) (throw 'music-found music))
                            #f music))
         (lambda (key music) music)))

Now the problem with that is that it is unhygienic.  If fold-some-music
were to use music-found signals, or if the predicate did, things would
be awkward.  One would need to work with a uniquely generated symbol.
It turns out that the above can be expressed much clearer and cleaner as

(define-public (find-child music predicate)
  "Find the first node in @var{music} that satisfies @var{predicate}."
  (call-with-current-continuation
   (lambda (music-found)
     (fold-some-music predicate
                      (lambda (music . _) (music-found music))
                      #f music))))

at least if I did not make some thinko here.  It is basically the same
code and stack-upwards-only, but hygienic.  Nothing can call the
continuation but what is inside.  Well, of course fold-some-music could
save the closure calling music-found for later.  But it doesn't.

Is there a way to get a call-with-current-continuation that does not
create a stack copy?  It is fine if it fails with an exception if one
still tries calling the continuation after it has already returned.

-- 
David Kastrup




reply via email to

[Prev in Thread] Current Thread [Next in Thread]