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