; Due to the nature of continuations, there will not be test cases on the server.
; paste these expressions one-at-a-time into a Scheme window.
; The assignment document tells how to make this easy if you use Emacs.

; Additional test cases may be added, and if so, there may be 
; adjustments to point values of some existing tests.


(eval-one-exp '
(+ 5 (call/cc 
  (lambda (k) (+ 6 (k 7)))))) ; 1. answer: 12      15 points


(eval-one-exp '
(+ 3 (call/cc (lambda (k) (* 2 5)))))  ; 2. answer: 13  5 points


(eval-one-exp '
(+ 5 (call/cc (lambda (k) (or #f #f (+ 7 (k 4)) #f))))); answer: 9   15 points

(eval-one-exp '
 (+ 2 (call/cc (lambda (k) (+ 3 (let* ([x 5] [y (k 7)]) (k 5))))))
)  ; answer: 9

(eval-one-exp '
 ((car (call/cc list)) (list cdr 1 2 3))
) ; answer: (1 2 3)


(begin
  (reset-global-env)
  (eval-one-exp '
   (define xxx #f))
  (eval-one-exp '
   (+ 5 (call/cc (lambda (k) 
		   (set! xxx k)
		   2))))
  (eval-one-exp '
   (* 7 (xxx 4)))) ; answer: 9                       15  points

(eval-one-exp '(list (call/cc procedure?))) ; answer:  (#t)   10  points

(begin 
  (reset-global-env)
  (eval-one-exp '
   (define strange1
     (lambda (x)
       (display 1)
       (call/cc x)
       (display 2)
       (newline))))
  
  (eval-one-exp '
   (strange1 (call/cc (lambda (k) (k k))))))  ; answer: 112     20  points

(begin
  (eval-one-exp '(define break-out-of-map #f))

  (eval-one-exp '
   (set! break-out-of-map
     (call/cc (lambda (k)
		(lambda (x)
		  (if (= x 7)
		      (k 1000)
		      (+ x 4)))))))

  (eval-one-exp '(map break-out-of-map '(1 3 5 7 9 11)))

  (eval-one-exp 'break-out-of-map))  ; answer:  1000    20 points


(begin
  (eval-one-exp '
   (define jump-into-map #f))

  (eval-one-exp '
   (define do-the-map
     (lambda (x) 
       (map (lambda (v)
	      (if (= v 7)
		  (call/cc (lambda (k) (set! jump-into-map k) 100))
		  (+ 3 v)))
	    x))))   

  (eval-one-exp '
   (list (do-the-map '(3 4 5 6 7 8 9 10)))) ; answer: (6 7 8 9 100 11 12 13)

(eval-one-exp '
 (jump-into-map 987654321))) ; answer: (6 7 8 9 987654321 11 12 13)   20 point2
	  
	 

;----------------   exit

(begin
  (reset-global-env)
  (eval-one-exp '
   (+ 4 (exit-list 5 (exit-list 6 7))) ; answer (6 7)        10 points
))

(begin
  (reset-global-env)
  (eval-one-exp '
   (+  3 (- 2 (exit-list 5)))))   ; answer (5)         10 points

(begin
  (reset-global-env)
  (eval-one-exp '
   (- 7 (if (exit-list 3) 4 5)))) ; answer (3)         10 points

(begin 
  (reset-global-env)		    
  (eval-one-exp '(call/cc (lambda (k) (+ 100 (exit-list (+ 3 (k 12))))))))  ; Answer 12      15 points

(begin
  (reset-global-env)
  (eval-one-exp '(call/cc (lambda (k) (+ 100 (k (+ 3 (exit-list 12)))))))) ; answer (12)     15 points