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