;; replace once, with two continuations - success and failure
(define (rplac1_2 xs a b)
(let g ((xs xs) (s (lambda (x) x)) (f (lambda () xs)))
(cond
((null? xs) (f))
((not (pair? xs))
(if (eq? xs a) (s b) (f)))
(else
(g (car xs)
(lambda (x) ; succeded!
(s (cons x (cdr xs))))
(lambda () ; failed (nothing to replace yet, keep trying)
(g (cdr xs)
(lambda (y) ; succeeded!
(s (cons (car xs) y)))
f))))))) ; none replaced
(display (rplac1_2 '((((a 2) 3 4) a) 6) 'a 'b)) (newline)
(display (rplac1_2 '((((c 2) 3 4) a) 6) 'a 'b)) (newline)
(display (rplac1_2 '((((c 2) 3 a) a) 6) 'a 'b)) (newline)
;; Success time: 0.03 memory: 4176 signal:0
;; ((((b 2) 3 4) a) 6)
;; ((((c 2) 3 4) b) 6)
;; ((((c 2) 3 b) a) 6)
OzsgcmVwbGFjZSBvbmNlLCB3aXRoIHR3byBjb250aW51YXRpb25zIC0gc3VjY2VzcyBhbmQgZmFpbHVyZQooZGVmaW5lIChycGxhYzFfMiB4cyBhIGIpCiAgKGxldCBnICgoeHMgeHMpIChzIChsYW1iZGEgKHgpIHgpKSAoZiAobGFtYmRhICgpIHhzKSkpCiAgICAoY29uZAogICAgICAoKG51bGw/IHhzKSAoZikpCiAgICAgICgobm90IChwYWlyPyB4cykpCiAgICAgICAgKGlmIChlcT8geHMgYSkgKHMgYikgKGYpKSkKICAgICAgKGVsc2UKICAgICAgICAoZyAoY2FyIHhzKQogICAgICAgICAgIChsYW1iZGEgKHgpIDsgc3VjY2VkZWQhCiAgICAgICAgICAgICAocyAoY29ucyB4IChjZHIgeHMpKSkpCiAgICAgICAgICAgKGxhbWJkYSAoKSA7IGZhaWxlZCAobm90aGluZyB0byByZXBsYWNlIHlldCwga2VlcCB0cnlpbmcpCiAgICAgICAgICAgICAoZyAoY2RyIHhzKQogICAgICAgICAgICAgICAgKGxhbWJkYSAoeSkgOyBzdWNjZWVkZWQhCiAgICAgICAgICAgICAgICAgIChzIChjb25zIChjYXIgeHMpIHkpKSkKICAgICAgICAgICAgICAgICBmKSkpKSkpKSAgIDsgbm9uZSByZXBsYWNlZAoKKGRpc3BsYXkgKHJwbGFjMV8yICcoKCgoYSAyKSAzIDQpIGEpIDYpICdhICdiKSkgKG5ld2xpbmUpCihkaXNwbGF5IChycGxhYzFfMiAnKCgoKGMgMikgMyA0KSBhKSA2KSAnYSAnYikpIChuZXdsaW5lKQooZGlzcGxheSAocnBsYWMxXzIgJygoKChjIDIpIDMgYSkgYSkgNikgJ2EgJ2IpKSAobmV3bGluZSkKCjs7IFN1Y2Nlc3MJdGltZTogMC4wMyBtZW1vcnk6IDQxNzYgc2lnbmFsOjAKOzsgKCgoKGIgMikgMyA0KSBhKSA2KQo7OyAoKCgoYyAyKSAzIDQpIGIpIDYpCjs7ICgoKChjIDIpIDMgYikgYSkgNik=