If I understand correctly, you only need to call the continuation once. Is that right?
In that case, I think you could use either catch and throw or prompts. (And catch and throw are implemented with prompts, so really, you can just choose how you want to use prompts.) Noah On Thu, Mar 1, 2012 at 7:00 PM, David Kastrup <d...@gnu.org> 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? It is fine if it fails with an exception if one > still tries calling the continuation after it has already returned. > > -- > David Kastrup > >