(define apply-continuation (lambda (k . v) (apply k v))) (define substitute-leftmost (lambda (new old slist) (subst-left-cps new old slist (lambda (v) v) ; succeed continuation (lambda () slist) ; fail continuation ))) (define subst-left-cps (lambda (new old slist changed unchanged) (let loop ([slist slist] [changed changed] [unchanged unchanged]) (cond [(null? slist) (apply-continuation unchanged)] [(symbol? (car slist)) (if (eqv? (car slist) old) (apply-continuation changed (cons new (cdr slist))) (loop (cdr slist) (lambda (substituted-cdr) (apply-continuation changed (cons (car slist) substituted-cdr))) unchanged))] [else (loop (car slist) (lambda (substituted-car) (apply-continuation changed (cons substituted-car (cdr slist)))) (lambda () (loop (cdr slist) (lambda (substituted-cdr) (apply-continuation changed (cons (car slist) substituted-cdr))) unchanged)) )])))) (substitute-leftmost 'x 's '((c a (b a) () ( () d s))))