[cl-utilities-cvs] CVS update: cl-utilities/extremum.lisp

Peter Scott pscott at common-lisp.net
Fri May 13 19:45:10 UTC 2005


Update of /project/cl-utilities/cvsroot/cl-utilities
In directory common-lisp.net:/tmp/cvs-serv1422

Modified Files:
	extremum.lisp 
Log Message:
Added a couple of compiler macros which optimize the case where KEY is
#'identity.

Date: Fri May 13 21:45:10 2005
Author: pscott

Index: cl-utilities/extremum.lisp
diff -u cl-utilities/extremum.lisp:1.2 cl-utilities/extremum.lisp:1.3
--- cl-utilities/extremum.lisp:1.2	Thu May 12 23:17:23 2005
+++ cl-utilities/extremum.lisp	Fri May 13 21:45:09 2005
@@ -7,12 +7,21 @@
 
 (defun comparator (test &optional (key #'identity))
   "Comparison operator: auxilliary function used by EXTREMUM"
+  (declare (optimize (speed 3) (safety 0) (space 0) (debug 1)))
   (lambda (a b) (if (funcall test
                              (funcall key a)
                              (funcall key b))
                     a
                     b)))
 
+;; This optimizes the case where KEY is #'identity
+(define-compiler-macro comparator (&whole whole test
+					  &optional (key #'identity))
+  (if (eql key #'identity)
+      `(lambda (a b)
+	(if (funcall ,test a b) a b))
+      whole))
+
 (defun zero-length-p (sequence)
   "Is the length of SEQUENCE equal to zero?"
   (declare (optimize (speed 3) (safety 0) (space 0) (debug 1)))
@@ -39,6 +48,21 @@
 	  nil))
       (reduce (comparator predicate key) sequence
 	      :start start :end end)))
+
+;; This optimizes the case where KEY is #'identity
+(define-compiler-macro extremum (&whole whole sequence predicate
+					&key (key #'identity) (start 0) end)
+  (if (eql key #'identity)
+      (once-only (sequence predicate start end)
+	`(if (zero-length-p ,sequence)
+	  (restart-case (error 'no-extremum)
+	    (continue ()
+	      :report "Return NIL instead"
+	      nil))
+	  (locally (declare (optimize (speed 3) (safety 0) (space 0) (debug 1)))
+	    (reduce (comparator ,predicate) ,sequence
+		    :start ,start :end ,end))))
+      whole))
 
 ;; And, for backup, here's a strictly spec-compliant version.
 #+nil




More information about the Cl-utilities-cvs mailing list