Question 1:

(i 2)  --> 6
((i 2) (lambda (x) x))  --> error


Question 3:

No!  Look at the common path 001001.  
It leads to an arrow and Int.


Question 4:

(define sum
  (lambda (l)
    (if (null? l)
        0
        (+ (car l) (sum (cdr l))))))

(define f
  (lambda (l)
    (if (= (sum l) 5)
        5
        (if (null? l)
            1
            (+ (sum l) (f (cdr l)))))))

(define sum-cps
  (lambda (l k)
    (if (null? l)
        (k 0)
        (sum-cps (cdr l) (lambda (v1) (k (+ (car l) v1)))))))

(define f-cps
  (lambda (l k)
    (sum-cps l (lambda (v2)
      (if (= v2 5)
          (k 5)
          (if (null? l)
              (k 1)
              (sum-cps l (lambda (v3)
                (f-cps (cdr l) (lambda (v4)
                  (k (+ v3 v4))))))))))))

(define f2
  (lambda (l)
    (f-cps l (lambda (x) x))))

;; (1 l ...)
;; (2 l ...)
;; (3 l ...)
;; (4 v3 ...)

(define sum-fo
  (lambda (l k)
    (if (null? l)
        (apply-cont k 0)
        (sum-fo (cdr l) (cons 1 (cons l k))))))

(define f-fo
  (lambda (l k)
    (sum-fo l (cons 2 (cons l k)))))

(define f3
  (lambda (l)
    (f-fo l '())))

(define apply-cont
  (lambda (k x)
    (if (null? k)
        x
        (case (car k)
              ((1) (apply-cont (cddr k) (+ (car (cadr k)) x)))
              ((2) (if (= x 5) (apply-cont (cddr k) 5)
                               (if (null? (cadr k)) 
                                   (apply-cont (cddr k) 1)
                                   (sum-fo (cadr k) (cons 3 (cdr k))))))
              ((3) (f-fo (cdr (cadr k)) (cons 4 (cons x (cddr k)))))
              ((4) (apply-cont (cddr k) (+ (cadr k) x)))))))


(define l 'dummy)
(define k '())
(define x 'dummy)

(define sum-no
  (lambda ()
    (if (null? l)
        (begin (set! x 0) (apply-cont-fo))
        (begin (set! k (cons 1 (cons l k))) (set! l (cdr l)) (sum-no)))))

(define f-no
  (lambda ()
    (set! k (cons 2 (cons l k))) (sum-no)))

(define f4
  (lambda (l1)
    (set! l l1)
    (f-no)))

(define apply-cont-fo
  (lambda ()
    (if (null? k)
        x
        (case (car k)
              ((1) (set! x (+ (car (cadr k)) x))
                   (set! k (cddr k))
                   (apply-cont-fo))
              ((2) (if (= x 5) (begin 
                                 (set! k (cddr k))
                                 (set! x 5)
                                 (apply-cont-fo))
                               (if (null? (cadr k))
                                   (begin
                                     (set! k (cddr k))
                                     (set! x 1)
                                     (apply-cont-fo))
                                   (begin
                                     (set! l (cadr k))
                                     (set! k (cons 3 (cdr k)))
                                     (sum-no)))))
              ((3) (set! l (cdr (cadr k)))
                   (set! k (cons 4 (cons x (cddr k))))
                   (f-no))
              ((4) (set! x (+ (cadr k) x))
                   (set! k (cddr k))
                   (apply-cont-fo))))))
