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