[funds-cvs] r123 - trunk/funds/src

abaine at common-lisp.net abaine at common-lisp.net
Wed Aug 8 02:34:25 UTC 2007


Author: abaine
Date: Tue Aug  7 22:34:25 2007
New Revision: 123

Modified:
   trunk/funds/src/dictionary.lisp
Log:
Implimented dictionary functionality.

Modified: trunk/funds/src/dictionary.lisp
==============================================================================
--- trunk/funds/src/dictionary.lisp	(original)
+++ trunk/funds/src/dictionary.lisp	Tue Aug  7 22:34:25 2007
@@ -2,14 +2,38 @@
 (in-package :funds)
 
 (defstruct dict 
-  hash-function
-  test-function
+  hash
+  test
   tree)
 
-(defun make-dictionary (&key hash-function test))
+(defun make-dictionary (&key (hash #'sxhash) (test #'eql))
+  (make-dict :hash hash :test test :tree (make-avl-tree)))
 
-(defun dictionary-add (dictionary key value))
+(defun dictionary-add (d k v)
+  (let* ((h (funcall (dict-hash d) k))
+	 (old-alist (tree-find (dict-tree d) h))
+	 (new-alist (acons k v (remove (assoc k old-alist :test (dict-test d))
+				       old-alist))))
+    (make-dict :hash (dict-hash d)
+	       :test (dict-test d)
+	       :tree (tree-insert (dict-tree d) h new-alist))))
 
-(defun dictionary-remove (dictionary key))
+(defun dictionary-remove (d k)
+  (let* ((h (funcall (dict-hash d) k))
+	 (old-alist (tree-find (dict-tree d) h))
+	 (new-alist (remove (assoc k old-alist :test (dict-test d))
+			    old-alist)))
+    (make-dict :hash (dict-hash d)
+	       :test (dict-test d)
+	       :tree (if (null new-alist)
+			 (tree-remove (dict-tree d) h)
+			 (tree-insert (dict-tree d) h new-alist)))))
+
+(defun dictionary-lookup (d k)
+  (let ((pair (assoc k 
+		     (tree-find (dict-tree d) (funcall (dict-hash d) k))
+		     :test (dict-test d))))
+    (if (null pair)
+	(values nil nil)
+	(values (cdr pair) t))))
 
-(defun dictionary-lookup (dictionary key))



More information about the Funds-cvs mailing list