a6.ss

;;
;; C311 Assignment 6
;; CPS transformation
;; Due T 3/4 @ 11:59pm
;;

; 1. assq

(define assq-cps
  (lambda (a als k)
    (cond
      [(null? als) (k #f)]
      [(eq? (caar als) a) (k (car als))]
      [else (assq-cps a (cdr als) k)])))


; 2. duplicate

(define duplicate-cps
  (lambda (n a k)
    (if (zero? n)
      (k '())
      (duplicate-cps (sub1 n) a
	(lambda (v)
	  (k (cons a v)))))))


; 3. union

(define union-cps
  (lambda (s0 s1 k)
    (if (null? s0)
      (k s1)
      (memq-cps (car s0) s1
	(lambda (v)
	  (if v
	    (union-cps (cdr s0) s1 k)
	    (union-cps (cdr s0) s1
	      (lambda (v)
		(k (cons (car s0) v))))))))))


; 4. snoc

(define snoc-cps
  (lambda (ls i k)
    (if (null? ls)
      (k (list i))
      (snoc-cps (cdr ls) i
	(lambda (v)
	  (k (cons (car ls) v)))))))


; 5. prefixes

(define prefixes-cps
  (letrec ([prefix-hlp
	     (lambda (ls current-prefix answ k)
	       (if (null? ls)
		 (k answ)
		 (snoc-cps current-prefix (car ls)
		   (lambda (v)
		     (let ([new-prefix v])
			  (prefix-hlp
			    (cdr ls)
			    new-prefix
			    (cons new-prefix answ)
			    k))))))])
    (lambda (ls k)
      (prefix-hlp ls '() '(()) k))))