;;; -*- Mode:SCHEME; Package:SCHEME; Readtable:SCHEME; Base:10 -*-

(define (make-tree-table id)
  (let ((table-alist '()))
    (let ((lookup
	    (lambda (key if-found if-not-found)
	      (letrec ((scan (lambda (tail)
			       (if (null? tail)
				   (if-not-found)
				   (let ((entry (first tail)))
				     (if (alikev? key (first entry))
					 (if-found entry)
					 (scan (rest tail))))))))
		(scan table-alist)))))
      (object nil
	((table-entry self key) (lookup key second (lambda () nil)))
	((set-table-entry self key new-value)
	 (lookup key
		 (lambda (entry)
		   (set (second entry) new-value))
		 (lambda ()
		   (set! table-alist (cons (list key new-value) table-alist)))))
	((table? self) t)
	((identification self) id)
	((print self stream) (format stream "#{HACK-TREE-TABLE ~S}" (identification self)))))))

					 