1 (defun make-tree (entry left right)
2 (list entry left right))
3 (defun make-leaf (entry)
7 (defun set-entry! (tree ent)
9 (defun left-branch (tree)
11 (defun set-left-branch! (tree lb)
12 (setf (cadr tree) lb))
13 (defun right-branch (tree)
15 (defun set-right-branch! (tree rb)
16 (setf (caddr tree) rb))
17 (defun make-record (key data)
24 (defun make-table (&key (<? #'<))
25 (let ((local-table (cons '*head* nil)))
26 (labels ((tree-root ()
28 (set-tree-root! (node)
29 (setf (cdr local-table) node))
30 (node-lookup (key node)
33 (let* ((cur-entry (entry node))
34 (cur-key (key cur-entry)))
35 (cond ((funcall <? key cur-key)
39 ((funcall <? cur-key key)
46 (node-lookup key (cdr local-table)))
47 (node-insert (key data node)
48 (let* ((cur-entry (entry node))
49 (cur-key (key cur-entry)))
50 (cond ((funcall <? key cur-key)
51 (if if (null (left-branch node))
55 (make-record key data)))
57 key data (left-branch node))))
58 ((funcall <? cur-key key)
59 (if (null (right-branch node))
63 (make-record key data)))
65 key data (right-branch node))))
68 node (make-record key data))))))
70 (if (null (tree-root))
72 (make-leaf (make-record key data)))
73 (node-insert key data (tree-root))))
76 ('lookup-proc #'lookup)
77 ('insert-proc! #'insert!)
78 (otherwise (error "Bad dispatch ~a" m)))))