;; Exercise 8.5.3 (load "final-valcont.scm") ;; Part a: REMOVE* (define remove*-cps (lambda (a alst k) (cond ((null? alst) (k '())) ((pair? (car alst)) (remove*-cps a (car alst) (lambda (v) (remove*-cps a (cdr alst) (lambda (w) (k (cons v w))))))) ((eq? (car alst) a) (remove*-cps a (cdr alst) k)) (else (remove*-cps a (cdr alst) (lambda (v) (k (cons (car alst) v)))))))) ;; Part b: MEMBER* (define member*-cps (lambda (a alst k) (cond ((null? alst) (k #f)) ((pair? (car alst)) (member*-cps a (car alst) (lambda (v) (if v (k v) (member*-cps a (cdr alst) k))))) ((eq? (car alst) a) (k alst)) (else (member*-cps a (cdr alst) k))))) ;; Part c: REMFIRST* (define remfirst*-cps (lambda (a alst k) (letrec ((loop (lambda (alst k) (cond ((null? alst) (k '())) ((not (pair? (car alst))) (if (eq? (car alst) a) (k (cdr alst)) (loop (cdr alst) (lambda (v) (k (cons (car alst) v)))))) (else (loop (car alst) (lambda (v) (if (equal? v (car alst)) (loop (cdr alst) (lambda (w) (k (cons (car alst) w)))) (loop (car alst) (lambda (w) (k (cons w (cdr alst))))))))))))) (loop alst k)))) ;; Part d: DEPTH (define depth-cps (lambda (alst k) (cond ((null? alst) (k 1)) ((not (pair? (car alst))) (depth-cps (cdr alst) k)) (else (depth-cps (car alst) (lambda (v) (depth-cps (cdr alst) (lambda (w) (if (< (+ v 1) w) (depth-cps (cdr alst) k) (depth-cps (car alst) (lambda (x) (k (+ x 1))))))))))))) ;; Part e: DEPTH-WITH-LET (define depth-with-let-cps (lambda (alst k) (if (null? alst) (k 1) (depth-with-let-cps (cdr alst) (lambda (v) (let ((drest v)) (if (pair? (car alst)) (depth-with-let-cps (car alst) (lambda (w) (k (let ((dfirst (+ w 1))) (if (< dfirst drest) drest dfirst)))) (k drest))))))))