UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture16/ get-num4.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 (example2)
  (output
   (+ (get-num/k "First number: " (lambda (n) n))
      (get-num/k "Second number: " (lambda (n) n)))))