#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)))))