On Fri, Mar 2, 2012 at 8:00 AM, David Kastrup 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 > > >