Raymond Toy pushed to branch issue-240-add-hashtable-for-destructive-set-ops at cmucl / cmucl
Commits:
- 
6b3621ac
by Raymond Toy at 2023-08-22T15:13:03-07:00
 
1 changed file:
Changes:
| ... | ... | @@ -863,15 +863,34 @@ | 
| 863 | 863 |  	   (cdr temp) ,destination
 | 
| 864 | 864 |  	   ,destination temp)))
 | 
| 865 | 865 | |
| 866 | +;;; Main processing for destructive set operations.  Like PROCESS-SET with same args,
 | 
|
| 867 | +;;; but for destructive operations.
 | 
|
| 868 | +(defmacro nprocess-set (init-res test-form)
 | 
|
| 869 | +  `(let ((res ,init-res)
 | 
|
| 870 | +         (list1 list1))
 | 
|
| 871 | +     (do ()
 | 
|
| 872 | +         ((endp list1))
 | 
|
| 873 | +       (if ,test-form
 | 
|
| 874 | +           (steve-splice list1 res)
 | 
|
| 875 | +           (setq list1 (cdr list1))))
 | 
|
| 876 | +     res))
 | 
|
| 877 | +  | 
|
| 878 | +  | 
|
| 866 | 879 |  (defun nunion (list1 list2 &key key (test #'eql testp) (test-not nil notp))
 | 
| 867 | 880 |    "Destructively returns the union list1 and list2."
 | 
| 868 | 881 |    (declare (inline member))
 | 
| 869 | 882 |    (if (and testp notp)
 | 
| 870 | 883 |        (error "Test and test-not both supplied."))
 | 
| 871 | 884 |    
 | 
| 872 | -  (let ((res list2)
 | 
|
| 885 | +  (let (#+nil
 | 
|
| 886 | +        (res list2)
 | 
|
| 873 | 887 |          (hashtable  (list-to-hashtable list2 key test test-not))
 | 
| 888 | +        #+nil
 | 
|
| 874 | 889 |  	(list1 list1))
 | 
| 890 | +    (if hashtable
 | 
|
| 891 | +        (nprocess-set list2 (not (nth-value 1 (gethash (apply-key key (car list1)) hashtable))))
 | 
|
| 892 | +        (nprocess-set list2 (not (with-set-keys (member (apply-key key (car list1)) list2)))))
 | 
|
| 893 | +    #+nil
 | 
|
| 875 | 894 |      (macrolet
 | 
| 876 | 895 |          ((process (test-form)
 | 
| 877 | 896 |             `(do ()
 | 
| ... | ... | @@ -892,9 +911,15 @@ | 
| 892 | 911 |    (declare (inline member))
 | 
| 893 | 912 |    (if (and testp notp)
 | 
| 894 | 913 |        (error "Test and test-not both supplied."))
 | 
| 895 | -  (let ((res nil)
 | 
|
| 914 | +  (let (#+nil
 | 
|
| 915 | +        (res nil)
 | 
|
| 896 | 916 |          (hashtable (list-to-hashtable list2 key test test-not))
 | 
| 897 | -	(list1 list1))
 | 
|
| 917 | +	#+nil
 | 
|
| 918 | +        (list1 list1))
 | 
|
| 919 | +    (if hashtable
 | 
|
| 920 | +        (nprocess-set nil (nth-value 1 (gethash (apply-key key (car list1)) hashtable)))
 | 
|
| 921 | +        (nprocess-set nil (with-set-keys (member (apply-key key (car list1)) list2))))
 | 
|
| 922 | +    #+nil
 | 
|
| 898 | 923 |      (macrolet
 | 
| 899 | 924 |          ((process (test-form)
 | 
| 900 | 925 |             `(do () ((endp list1))
 | 
| ... | ... | @@ -913,9 +938,15 @@ | 
| 913 | 938 |    (declare (inline member))
 | 
| 914 | 939 |    (if (and testp notp)
 | 
| 915 | 940 |        (error "Test and test-not both supplied."))
 | 
| 916 | -  (let ((res nil)
 | 
|
| 941 | +  (let (#+nil
 | 
|
| 942 | +        (res nil)
 | 
|
| 917 | 943 |          (hashtable (list-to-hashtable list2 key test test-not))
 | 
| 918 | -	(list1 list1))
 | 
|
| 944 | +	#+nil
 | 
|
| 945 | +        (list1 list1))
 | 
|
| 946 | +    (if hashtable
 | 
|
| 947 | +        (nprocess-set nil (not (nth-value 1 (gethash (apply-key key (car list1)) hashtable))))
 | 
|
| 948 | +        (nprocess-set nil (not (with-set-keys (member (apply-key key (car list1)) list2)))))
 | 
|
| 949 | +    #+nil
 | 
|
| 919 | 950 |      (macrolet
 | 
| 920 | 951 |          ((process (test-form)
 | 
| 921 | 952 |             `(do () ((endp list1))
 |