1.0.7.25: better MEMBER transform
[sbcl.git] / src / code / list.lisp
index 5f38f71..7cedd81 100644 (file)
     (do ((list list (cdr list)))
         ((null list) nil)
       (let ((car (car list)))
-        (if (satisfies-the-test item car)
-            (return list))))))
+        (when (satisfies-the-test item car)
+          (return list))))))
+
+(macrolet ((def (name funs form)
+             `(defun ,name (item list ,@funs)
+                ,@(when funs `((declare (function ,@funs))))
+                (do ((list list (cdr list)))
+                    ((null list) nil)
+                  (when ,form
+                    (return list))))))
+  (def %member ()
+    (eql item (car list)))
+  (def %member-key (key)
+    (eql item (funcall key (car list))))
+  (def %member-key-test (key test)
+    (funcall test item (funcall key (car list))))
+  (def %member-key-test-not (key test-not)
+    (not (funcall test-not item (funcall key (car list)))))
+  (def %member-test (test)
+    (funcall test item (car list)))
+  (def %member-test-not (test-not)
+    (not (funcall test-not item (car list)))))
 
 (defun member-if (test list &key key)
   #!+sb-doc