(define make-stack
 (lambda ()
  (let ([stk '()])
   (lambda (msg  . args ) 
    (case msg
      [(empty?) (null? stk)]
      [(push)   (set! stk (cons (car args) stk))]
      [(pop)    (let ([top (car stk)])
                   (set! stk (cdr stk))
                   top)]
      [else (errorf 'stack "illegal message to stack object: ~a" msg)])))))