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