RosettaCodeData/Task/Stack/Ol/stack-2.ol

38 lines
959 B
Plaintext

(fork-server 'stack (lambda ()
(let this ((me '()))
(let*((envelope (wait-mail))
(sender msg envelope))
(case msg
(['empty]
(mail sender (null? me))
(this me))
(['push value]
(this (cons value me)))
(['pop]
(cond
((null? me)
(mail sender #false)
(this me))
(else
(mail sender (car me))
(this (cdr me))))))))))
(define (push value)
(mail 'stack ['push value]))
(define (pop)
(interact 'stack ['pop]))
(define (empty)
(interact 'stack ['empty]))
(for-each (lambda (n)
(print "pushing " n)
(push n))
(iota 5 1)) ; '(1 2 3 4 5)
(let loop ()
(print "is stack empty: " (empty))
(unless (empty)
(begin
(print "popping value, got " (pop))
(loop))))
(print "done.")