Q.1: (i 2)  -->  error
     (i (lambda (x) x))  -->  (lambda (x) x)
     ((i (lambda (x) x)) 2)  -->  2

Q.2: See Lecture Note 3.

Q.3: Yes.

Q.4:

(define streak
  (lambda (l n)
    (if (null? l)
        l
        (if (eq? (car l) n)
            (cons n (streak (cdr l) (+ n 1)))
            (streak (cdr l) n)))))


(define streak-cps
  (lambda (l n k)
    (if (null? l)
        (k l)
        (if (eq? (car l) n)
            (streak-cps (cdr l) (+ n 1) (lambda (v) (k (cons n v))))
            (streak-cps (cdr l) n k)))))

(define s2
  (lambda (l n)
    (streak-cps l n (lambda (v) v))))


(define streak-fo
  (lambda (l n k)
    (if (null? l)
        (apply-cont k l)
        (if (eq? (car l) n)
            (streak-fo (cdr l) (+ n 1) (cons n k))
            (streak-fo (cdr l) n k)))))

(define apply-cont
  (lambda (k x)
    (if (null? k)
        x
        (apply-cont (cdr k) (cons (car k) x)))))

(define s3
  (lambda (l n)
    (streak-fo l n '())))


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

(define streak-imp
  (lambda ()
    (if (null? l)
        (begin
          (set! x l)
          (apply-imp))
        (if (eq? (car l) n)
            (begin
              (set! l (cdr l))
              (set! k (cons n k))
              (set! n (+ n 1))
              (streak-imp))
            (begin
              (set! l (cdr l))
              (streak-imp))))))

(define apply-imp
  (lambda ()
    (if (null? k)
        x
        (begin
          (set! x (cons (car k) x))  
          (set! k (cdr k))
          (apply-imp)))))
