guile-devel
[Top][All Lists]
Advanced

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

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


From: Nala Ginrut
Subject: Re: Non-stack-copying call-with-current-continuation?
Date: Fri, 2 Mar 2012 09:18:56 +0800



On Fri, Mar 2, 2012 at 8:00 AM, David Kastrup <address@hidden> wrote:

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?  

IIRC, the stack copying in Guile's continuation implementation is inevitable. Though it's inefficient, the consideration is to cooperate with other languages such as C. 
 
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]