; two stacks
(define mem-size 10) ; small for testing
(define arena (make-vector mem-size))
(define lo-one 0) (define hi-one 0)
(define lo-two (- mem-size 1)) (define hi-two (- mem-size 1))
(define (push-one x)
(cond ((< lo-two hi-one) (error 'push-one "arena overflow"))
(else (vector-set! arena hi-one x) (set! hi-one (+ hi-one 1)))))
(define (push-two x)
(cond ((< lo-two hi-one) (error 'push-two "arena overflow"))
(else (vector-set! arena lo-two x) (set! lo-two (- lo-two 1)))))
(define (pop-one)
(cond ((= lo-one hi-one) (error 'pop-one "empty stack"))
(else (set! hi-one (- hi-one 1)) (vector-ref arena hi-one))))
(define (pop-two)
(cond ((= lo-two hi-two) (error 'pop-two "empty stack"))
(else (set! lo-two (+ lo-two 1)) (vector-ref arena lo-two))))
(push-one 1)
(push-one 2)
(push-one 3)
(push-one 4)
(push-one 5)
(push-one 6)
(push-two #\a)
(push-two #\b)
(push-two #\c)
(push-two #\d)
(display (pop-one)) (newline)
(display (pop-one)) (newline)
(display (pop-one)) (newline)
(display (pop-one)) (newline)
(display (pop-one)) (newline)
(display (pop-one)) (newline)
(display (pop-two)) (newline)
(display (pop-two)) (newline)
(display (pop-two)) (newline)
(display (pop-two)) (newline)