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