;;; -*- Mode:LISP;  Ibase:10; Base:10 -*-

;;; Structure of the discrimination net:
;;;   

(defmacro item-of-node (node)
  `(car ,node))

(defmacro a-list-of-node (node)
  `(cdr ,node))

(defmacro key-of-link (link)
  `(car ,link))

(defmacro node-of-link (link)
  `(cdr ,link))

(defvar discrim-net nil)


(defmacro add-to-a-list (exp1 exp2)
  `(cons ,exp1 ,exp2))

(defun test-index (item node)
  (index-list-of-atoms item node))

(defun index-list-of-atoms (item node)
  (let ((final-node (establish-nodes item node)))
    (print final-node)
    (cond ((item-of-node final-node))
	  (t (setf (item-of-node final-node) item)
	     item))))



(defun establish-nodes (item node)
  (cond ((null item) node)
	(t (establish-nodes (cdr item)
			    (establish-node (car item) node)))))




(defun establish-node (key node)
  (let ((link (assoc key (if node (a-list-of-node node) nil))))
    (cond (link (node-of-link link))
	  (t (let ((next-node (ncons nil)))
	       (setf (a-list-of-node node)
		     (add-to-a-list (cons key next-node)
			   (if node (a-list-of-node node))))
	       next-node)))))