(module store (lib "eopl.ss" "eopl")

  (require "../drscheme-init.scm")

  (provide initialize-store! reference? newref deref setref! get-store)

;;;;;;;;;;;;;;;; references and the store ;;;;;;;;;;;;;;;;

;;; world's dumbest model of the store:  the store is a list and a
;;; reference is number which denotes a position in the list.

  (define empty-store
    (lambda () '()))

  (define the-store (empty-store))
  
  (define get-store
    (lambda () the-store))
  
  (define initialize-store!
    (lambda ()
      (set! the-store (empty-store))))

  (define reference? integer?)

  (define newref
    (lambda (val)
      (let ((next-ref (length the-store)))
        (set! the-store
          (append the-store (list val)))
        next-ref)))                     ; YUCK!

  (define deref 
    (lambda (ref) (list-ref the-store ref)))

  (define setref!                       ; YUCK!
    (lambda (ref0 val)
      (set! the-store
        (let recur ((store the-store) (ref ref0))
          (cond
            ((null? store)
             (eopl:error 'setref
               "illegal reference ~s in store ~s"
               ref0 the-store))
            ((zero? ref)
             (cons val (cdr store)))
            (else
              (cons
                (car store)
                (recur (cdr store) (- ref 1)))))))))

  )