;; rplac1 alist 'a 'b -- replace FIRST OCCURENCE of 'a to 'b
;; tests:
;; (rplac1 '((((1 2) 3 4) a) 6) 'a 'b) ==> ((((1 2) 3 4) b) 6)
;; (rplac1 '((((a 2) 3 4) a) 6) 'a 'b) ==> ((((b 2) 3 4) a) 6)
(define (replace1 xs a b) ; deriving it step by step...
(let g ((xs xs))
(cond
((null? xs) xs) ; http://stackoverflow.com/q/16550176/849891
((not (pair? xs))
(if (eq? xs a) b xs))
(else
(cons (g (car xs))
(g (cdr xs)))))))
;; (display (replace1 '((((a 2) 3 4) a) 6) 'a 'b)) (newline) ;; OK
(define (replace2 xs a b)
(let g ((xs xs) (k (lambda (x) x)))
(cond
((null? xs) (k xs))
((not (pair? xs))
(if (eq? xs a) (k b) (k xs)))
(else
(g (car xs) (lambda (x)
(g (cdr xs) (lambda (y) (k (cons x y))))))))))
;; (display (replace2 '((((a 2) 3 4) a) 6) 'a 'b)) (newline) ;; OK
(define (rplac11 xs a b)
(let g ((xs xs) (f #f) (k (lambda (x y) x)))
(cond
((null? xs) (k xs f))
((not (pair? xs))
(if (eq? xs a) (if (not f) (k b #t) (k a f))
(k xs f)))
(else
(g (car xs) f (lambda (x f)
(g (cdr xs) f (lambda (y f) (k (cons x y) f)))))))))
(define (rplac12 xs a b)
(let g ((xs xs) (f #f) (k (lambda (x y) x)))
(cond
((null? xs) (k xs f))
((not (pair? xs))
(if (eq? xs a) (if (not f) (k b #t) (k a f))
(k xs f)))
(f (k xs f)) ; shortcut! (Haskelly argnames FTW!)
(else
(g (car xs) f (lambda (x f)
(g (cdr xs) f (lambda (y f) (k (cons x y) f)))))))))
(define (rplac1 xs a b)
(let g ((xs xs) (f #f) (k (lambda (x y) x)))
(cond
(f (k xs f)) ; shortcut right-away!
((null? xs) (k xs f))
((not (pair? xs))
(if (eq? xs a) (k b #t) (k xs f))) ; not f!
(else
(g (car xs) f (lambda (x f)
(g (cdr xs) f (lambda (y f)
(if (not f) ; keep as much
(k xs f) ; original structure
(k (cons x y) f)))))))))) ; as possible
(display (rplac1 '((((a 2) 3 4) a) 6) 'a 'b)) (newline)
(display (rplac1 '((((c 2) 3 4) a) 6) 'a 'b)) (newline)
(display (rplac1 '((((c 2) 3 a) a) 6) 'a 'b)) (newline)
;; produces:
;; Success time: 0.03 memory: 4132 signal:0
;; ((((b 2) 3 4) a) 6)
;; ((((c 2) 3 4) b) 6)
;; ((((c 2) 3 b) a) 6)