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))))