unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
* Non-stack-copying call-with-current-continuation?
@ 2012-03-02  0:00 David Kastrup
  2012-03-02  0:20 ` Noah Lavine
                   ` (2 more replies)
  0 siblings, 3 replies; 21+ messages in thread
From: David Kastrup @ 2012-03-02  0:00 UTC (permalink / raw)
  To: guile-devel


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




^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2012-03-05  1:44 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-03-02  0:00 Non-stack-copying call-with-current-continuation? David Kastrup
2012-03-02  0:20 ` Noah Lavine
2012-03-02  0:42   ` David Kastrup
2012-03-02  1:01     ` Noah Lavine
2012-03-02  1:35       ` David Kastrup
2012-03-02  1:49         ` Noah Lavine
2012-03-02  8:36           ` David Kastrup
2012-03-03  5:03             ` Andreas Rottmann
2012-03-03  5:04             ` Andreas Rottmann
2012-03-03 17:48         ` Andy Wingo
2012-03-04 12:01           ` David Kastrup
2012-03-04 12:15             ` Andy Wingo
2012-03-04 13:59               ` David Kastrup
2012-03-04 18:42                 ` Andy Wingo
2012-03-04 18:45                 ` Mark H Weaver
2012-03-04 23:13                   ` David Kastrup
2012-03-05  0:35                     ` Mark H Weaver
2012-03-05  1:44                       ` David Kastrup
2012-03-02  1:18 ` Nala Ginrut
2012-03-02  1:25   ` Noah Lavine
2012-03-03 17:41 ` Andy Wingo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).