UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture16/ fakeweb.rkt
#lang plait
(define (done)
  (error 'resume "nothing suspended."))

(define (yield/k prompt k)
  (begin (set-box! resumer k) (error 'yield prompt)))

(define (output n) (yield/k (to-string n) done))

(define resumer (box done))

(define (resume)
  ;; clear out `resumer' before invoking it
  (let ([next (unbox resumer)])
    (begin 
      (set-box! resumer done)
      (next))))

(define (get-num/k prompt k)
  (yield/k  "(resume) to go"
            (lambda () (begin (display prompt)
                              (k (s-exp->number (read)))))))

(define (example)
  (get-num/k "First number: "
             (lambda (n1)
               (get-num/k "Second number: "
                          (lambda (n2)
                            (output (+ n1 n2)))))))