; Problem 1 (define mem (lambda (a ls) (mem-cps a ls (lambda (v) v)))) (define mem-cps (lambda (a ls k) (cond ((null? ls) (k #f)) ((eq? a (car ls)) (k #t)) (else (mem-cps a (cdr ls) k))))) ; Problem 2 (define remove-all (lambda (ls1 ls2) (remove-all-cps ls1 ls2 (lambda (v) v)))) (define remove-all-cps (lambda (ls1 ls2 k) (cond ((null? ls1) (k ls2)) (else (remove-all-cps (cdr ls1) (remq (car ls1) ls2) k))))) ; Problem 3 (define append-all (lambda (lss) (append-all-cps lss (lambda (v) v)))) (define append-all-cps (lambda (lss k) (cond ((null? lss) (k '())) (else (append-all-cps (cdr lss) (lambda (v) (k (append (car lss) v)))))))) ; Problem 4 (define numlist? (lambda (ls) (numlist?-cps ls (lambda (v) v)))) (define numlist?-cps (lambda (ls k) (cond ((null? ls) (k #t)) ((number? ls) (k #t)) ((atom? ls) (k #f)) (else (numlist?-cps (car ls) (lambda (v1) (numlist?-cps (cdr ls) (lambda (v2) (k (and v1 v2 )))))))))) ; Problem 5 (define eval-ae (lambda (exp) (eval-ae-cps exp (lambda (v) v)))) (define eval-ae-cps (lambda (exp k) (cond ((number? exp) (k exp)) ((atom? exp) (error 'eval-ae-cps "invalid expression ~s" exp)) ((not (= (length exp) 3)) (error 'eval-ae-cps "invalid expression ~s" exp)) (else (let ((oper (case (car exp) ((+) +) ((-) -) ((*) *) ((/) /) (else (error 'eval-ae-cps "bad expression ~s" exp))))) (eval-ae-cps (cadr exp) (lambda (v1) (eval-ae-cps (caddr exp) (lambda (v2) (k (oper v1 v2)))))))))))