Sorry, ignore the previous one, it was unnecessarily confusing. This one's
cool.
? define QMaker() {
? define [enq, deq] := QMaker()
? enq(3)
? def a1 := deq()
? define a2 := deq()
? a1
? a2
? enq(4)
? a2
> define [qhead, qtail] := PromiseMaker()
> define cons(elem, next) {
> define pair {
> to getElem { elem }
> to getNext { next }
> }
> }
> [define enqueue(elem) {
> define [nextHead, nextTail] := PromiseMaker()
> qtail resolve(cons(elem, nextHead))
> qtail := nextTail
> null
> },
> define dequeue() {
> define result := qhead <- getElem
> qhead := qhead <- getNext
> result
> }]
> }
# value: <QMaker>
# value: [<enqueue>, <dequeue>]
# value: <Deferred ref>
# value: <Deferred ref>
# value: 3
# value: <Deferred ref>
# value: 4