C311 Fall96. Assignment 6 (solution)
;;
;; C311 Assignment 6
;; CPS transformation
;; Due F 10/25/96 @ 5:00pm
;;
; 1. list index
(define list-index-cps
(lambda (a ls k)
(cond
[(null? ls) (k -1)]
[(eq? (car ls) a) (k 0)]
[else
(list-index-cps a (cdr ls)
(lambda (v)
(let ([answ v])
(if (= answ -1)
(k -1)
(k (add1 answ))))))])))
; 2. intersection
(define intersection-cps
(lambda (s0 s1 k)
(cond
[(null? s0) (k '())]
[(memq (car s0) s1)
(intersection-cps (cdr s0) s1
(lambda (v)
(k (cons (car s0) v))))]
[else
(intersection-cps (cdr s0) s1 k)])))
; 3 count-parens
(define count-parens-cps
(lambda (ls k)
(cond
[(null? ls) (k 2)]
[(list? (car ls))
(count-parens-cps (car ls)
(lambda (v-car)
(count-parens-cps (cdr ls)
(lambda (v-cdr)
(k (+ v-car v-cdr))))))]
[else
(count-parens-cps (cdr ls) k)])))
; 4 depth
(define depth-cps
(lambda (ls k)
(cond
[(null? ls) (k 1)]
[(pair? ls) (depth-cps (car ls)
(lambda (v-car)
(depth-cps (cdr ls)
(lambda (v-cdr)
(k (max (add1 v-car) v-cdr))))))]
[else (k 0)])))
; vector-index
(define vector-index-cps
(lambda (a v k)
(let ([vlen (vector-length v)])
(letrec ([vindex-hlp-cps
(lambda (n k)
(cond
[(= vlen n) (k -1)]
[(eq? (vector-ref v n) a) (k n)]
[else (vindex-hlp-cps (add1 n) k)]))])
(vindex-hlp-cps 0 k)))))
Last modified on Wed Oct 23 23:33:08 1996