(define rember8 (lambda (ls) (cond [(null? ls) '()] [(pair? (car ls)) (cons (rember8 (car ls)) (rember8 (cdr ls)))] [(= (car ls) 8) (rember8 (cdr ls))] [else (cons (car ls) (rember8 (cdr ls)))]))) (define test-direct (lambda () (equal? (rember8 '((((((1 8 3)) 8) 7) 8) 9)) '((((((1 3))) 7)) 9)))) (pretty-print (test-direct)) (define rember8 (lambda (ls k) (cond [(null? ls) (k '())] ; <-- [(pair? (car ls)) (rember8 (car ls) (lambda (a) ; <-- (rember8 (cdr ls) (lambda (d) ; <-- (k (cons a d))))))] ; <-- [(= (car ls) 8) (rember8 (cdr ls) k)] ; <-- [else (rember8 (cdr ls) (lambda (d) ; <-- (k (cons (car ls) d))))]))) ; <-- (define test-cps (lambda () (rember8 '((((((1 8 3)) 8) 7) 8) 9) (lambda (x) (equal? x '((((((1 3))) 7)) 9)))))) ; <-- (pretty-print (test-cps)) (define rember8 (lambda (ls) (lambda (k) ; <-- (cond [(null? ls) (k '())] [(pair? (car ls)) ((rember8 (car ls)) ; <-- (lambda (a) ((rember8 (cdr ls)) ; <-- (lambda (d) (k (cons a d))))))] [(= (car ls) 8) ((rember8 (cdr ls)) ; <-- k)] [else ((rember8 (cdr ls)) ; <-- (lambda (d) (k (cons (car ls) d))))])))) (define test-cps-curried (lambda () ((rember8 '((((((1 8 3)) 8) 7) 8) 9)) ; <-- (lambda (x) (equal? x '((((((1 3))) 7)) 9)))))) (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (lambda (k) ; <-- (k '()))] [(pair? (car ls)) (lambda (k) ; <-- ((rember8 (car ls)) (lambda (a) ((rember8 (cdr ls)) (lambda (d) (k (cons a d)))))))] [(= (car ls) 8) (lambda (k) ; <-- ((rember8 (cdr ls)) k))] [else (lambda (k) ; <-- ((rember8 (cdr ls)) (lambda (d) (k (cons (car ls) d)))))]))) (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (lambda (k) (k '()))] [(pair? (car ls)) (lambda (k) ((rember8 (car ls)) (lambda (a) ((rember8 (cdr ls)) (lambda (d) (k (cons a d)))))))] [(= (car ls) 8) (rember8 (cdr ls))] ; <-- [else (lambda (k) ((rember8 (cdr ls)) (lambda (d) (k (cons (car ls) d)))))]))) (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (unit '())] ; <-- [(pair? (car ls)) (lambda (k) ((rember8 (car ls)) (lambda (a) ((rember8 (cdr ls)) (lambda (d) (k (cons a d)))))))] [(= (car ls) 8) (rember8 (cdr ls))] [else (lambda (k) ((rember8 (cdr ls)) (lambda (d) (k (cons (car ls) d)))))]))) (define unit (lambda (v) (lambda (k) (k v)))) (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (unit '())] [(pair? (car ls)) (lambda (k) ((rember8 (car ls)) (lambda (a) ((rember8 (cdr ls)) (lambda (d) (k (cons a d)))))))] [(= (car ls) 8) (rember8 (cdr ls))] [else (lambda (k) ((rember8 (cdr ls)) (lambda (d) ((lambda (k) ; <-- (k (cons (car ls) d))) k))))]))) ; <-- (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (unit '())] [(pair? (car ls)) (lambda (k) ((rember8 (car ls)) (lambda (a) ((rember8 (cdr ls)) (lambda (d) (k (cons a d)))))))] [(= (car ls) 8) (rember8 (cdr ls))] [else (lambda (k) ((rember8 (cdr ls)) (lambda (d) ((unit (cons (car ls) d)) ; <-- k))))]))) (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (unit '())] [(pair? (car ls)) (lambda (k) ((rember8 (car ls)) (lambda (a) ((rember8 (cdr ls)) (lambda (d) ((unit (cons a d)) ; <-- k))))))] [(= (car ls) 8) (rember8 (cdr ls))] [else (lambda (k) ((rember8 (cdr ls)) (lambda (d) ((unit (cons (car ls) d)) k))))]))) (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (unit '())] [(pair? (car ls)) (lambda (k) ((rember8 (car ls)) (lambda (a) ((rember8 (cdr ls)) (lambda (d) ((unit (cons a d)) k))))))] [(= (car ls) 8) (rember8 (cdr ls))] [else (bind* ; <-- (rember8 (cdr ls)) (lambda (k) ; <-- (lambda (d) ((unit (cons (car ls) d)) k))))]))) (define bind* (lambda (m w) (lambda (k^) (m (w k^))))) (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (unit '())] [(pair? (car ls)) (lambda (k) ((rember8 (car ls)) (lambda (a) ((rember8 (cdr ls)) (lambda (d) ((unit (cons a d)) k))))))] [(= (car ls) 8) (rember8 (cdr ls))] [else (bind ; <-- (rember8 (cdr ls)) (lambda (d) (lambda (k) ; <-- ((unit (cons (car ls) d)) k))))]))) (define bind (lambda (m w) (lambda (k^) (m (lambda (v) ((w v) k^)))))) (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (unit '())] [(pair? (car ls)) (lambda (k) ((rember8 (car ls)) (lambda (a) ((rember8 (cdr ls)) (lambda (d) ((unit (cons a d)) k))))))] [(= (car ls) 8) (rember8 (cdr ls))] [else (bind (rember8 (cdr ls)) (lambda (d) (unit (cons (car ls) d))))]))) ; <-- (pretty-print (test-cps-curried)) (define rember8 (lambda (ls) (cond [(null? ls) (unit '())] [(pair? (car ls)) (bind ; <-- (rember8 (car ls)) (lambda (a) (bind ; <-- (rember8 (cdr ls)) (lambda (d) (unit (cons a d))))))] ; <-- [(= (car ls) 8) (rember8 (cdr ls))] [else (bind (rember8 (cdr ls)) (lambda (d) (unit (cons (car ls) d))))]))) (pretty-print (test-cps-curried)) ;;; New stuff: (define callcc (lambda (f) (lambda (c) (let ((k (lambda (a) (lambda (_) (c a))))) ((f k) c))))) (define rember8 (lambda (ls) (callcc (lambda (exit) (letrec ([rember8 (lambda (ls) (cond [(null? ls) (unit '())] [(pair? (car ls)) (bind ; <-- (rember8 (car ls)) (lambda (a) (bind ; <-- (rember8 (cdr ls)) (lambda (d) (unit (cons a d))))))] ; <-- [(= (car ls) 0) (exit (cdr ls))] [(= (car ls) 8) (rember8 (cdr ls))] [else (bind (rember8 (cdr ls)) (lambda (d) (unit (cons (car ls) d))))]))]) (rember8 ls)))))) (define test-cps-curried-with-callcc (lambda () ((rember8 '((((((1 8 3)) 8) 7 0 8 9) 8) 9)) (lambda (x) x)))) (pretty-print (test-cps-curried-with-callcc)) (define rember8 (lambda (ls) (callcc (lambda (exit) (letrec ([rember8 (lambda (ls) (cond [(null? ls) (unit '())] [(pair? (car ls)) (bind ; <-- (rember8 (car ls)) (lambda (a) (bind ; <-- (rember8 (cdr ls)) (lambda (d) (unit (cons a d))))))] ; <-- [(= (car ls) 0) (exit (exit (cdr ls)))] [(= (car ls) 8) (rember8 (cdr ls))] [else (bind (rember8 (cdr ls)) (lambda (d) (unit (cons (car ls) d))))]))]) (rember8 ls)))))) (define test-cps-curried-with-callcc-with-second-exit (lambda () ((rember8 '((((((1 8 3)) 8) 7 0 8 9) 8) 9)) (lambda (x) x)))) (pretty-print (test-cps-curried-with-callcc-with-second-exit))