diff --git a/hash-tables.lisp b/hash-tables.lisp index f461a7035f0205ff45015e4fce8098669ec2c34f..a9f790220405f59a356aae749ac30eddd49bbb89 100644 --- a/hash-tables.lisp +++ b/hash-tables.lisp @@ -88,7 +88,7 @@ TABLE." ALIST. Hash table is initialized using the HASH-TABLE-INITARGS." (let ((table (apply #'make-hash-table hash-table-initargs))) (dolist (cons alist) - (setf (gethash (car cons) table) (cdr cons))) + (ensure-gethash (car cons) table (cdr cons))) table)) (defun plist-hash-table (plist &rest hash-table-initargs) @@ -97,5 +97,5 @@ PLIST. Hash table is initialized using the HASH-TABLE-INITARGS." (let ((table (apply #'make-hash-table hash-table-initargs))) (do ((tail plist (cddr tail))) ((not tail)) - (setf (gethash (car tail) table) (cadr tail))) + (ensure-gethash (car tail) table (cadr tail))) table)) diff --git a/tests.lisp b/tests.lisp index a00a700c30e0abb85efc837c7acccd06ee975efe..b70ef0475e818c972e2ca078dac6755475acaa56 100644 --- a/tests.lisp +++ b/tests.lisp @@ -373,6 +373,15 @@ (hash-table-test table)))) (3 (a) (b) (c) t)) +(deftest alist-hash-table.duplicate-keys + (let* ((alist '((0 a) (1 b) (0 c) (1 d) (2 e))) + (table (alist-hash-table alist))) + (list (hash-table-count table) + (gethash 0 table) + (gethash 1 table) + (gethash 2 table))) + (3 (a) (b) (e))) + (deftest plist-hash-table.1 (let* ((plist '(:a 1 :b 2 :c 3)) (table (plist-hash-table plist :test 'eq))) @@ -386,6 +395,15 @@ (hash-table-test table)))) (3 1 2 3 nil nil t)) +(deftest plist-hash-table.duplicate-keys + (let* ((plist '(:a 1 :b 2 :a 3 :b 4 :c 5)) + (table (plist-hash-table plist))) + (list (hash-table-count table) + (gethash :a table) + (gethash :b table) + (gethash :c table))) + (3 1 2 5)) + ;;;; Functions (deftest disjoin.1