fork download
  1. ;; replace once, with two continuations - success and failure
  2. (define (rplac1_2 xs a b)
  3. (let g ((xs xs) (s (lambda (x) x)) (f (lambda () xs)))
  4. (cond
  5. ((null? xs) (f))
  6. ((not (pair? xs))
  7. (if (eq? xs a) (s b) (f)))
  8. (else
  9. (g (car xs)
  10. (lambda (x) ; succeded!
  11. (s (cons x (cdr xs))))
  12. (lambda () ; failed (nothing to replace yet, keep trying)
  13. (g (cdr xs)
  14. (lambda (y) ; succeeded!
  15. (s (cons (car xs) y)))
  16. f))))))) ; none replaced
  17.  
  18. (display (rplac1_2 '((((a 2) 3 4) a) 6) 'a 'b)) (newline)
  19. (display (rplac1_2 '((((c 2) 3 4) a) 6) 'a 'b)) (newline)
  20. (display (rplac1_2 '((((c 2) 3 a) a) 6) 'a 'b)) (newline)
  21.  
  22. ;; Success time: 0.03 memory: 4176 signal:0
  23. ;; ((((b 2) 3 4) a) 6)
  24. ;; ((((c 2) 3 4) b) 6)
  25. ;; ((((c 2) 3 b) a) 6)
Success #stdin #stdout 0.02s 4176KB
stdin
Standard input is empty
stdout
((((b 2) 3 4) a) 6)
((((c 2) 3 4) b) 6)
((((c 2) 3 b) a) 6)