From: David Vázquez Date: Thu, 20 Jun 2013 12:06:57 +0000 (+0200) Subject: List version of reduce X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=243f68d9f0d3ec5456947968be12ebda45a60883;p=jscl.git List version of reduce --- diff --git a/src/sequence.lisp b/src/sequence.lisp index cda0b41..789a7c3 100644 --- a/src/sequence.lisp +++ b/src/sequence.lisp @@ -179,3 +179,27 @@ (defun copy-seq (sequence) (subseq sequence 0)) + +;;; Based on the SBCL's reduce implementation +(defun reduce (function sequence &key key from-end (start 0) end (initial-value nil ivp)) + (let ((key (or key #'identity)) + (end (or end (length sequence)))) + (if (= end start) + (if ivp initial-value (funcall function)) + (if from-end + (let ((sequence (nthcdr (- (length sequence) end) (reverse sequence)))) + (do ((count (if ivp start (1+ start)) + (1+ count)) + (sequence (if ivp sequence (cdr sequence)) + (cdr sequence)) + (value (if ivp initial-value (funcall key (car sequence))) + (funcall function (funcall key (car sequence)) value))) + ((>= count end) value))) + (let ((sequence (nthcdr start sequence))) + (do ((count (if ivp start (1+ start)) + (1+ count)) + (sequence (if ivp sequence (cdr sequence)) + (cdr sequence)) + (value (if ivp initial-value (funcall key (car sequence))) + (funcall function value (funcall key (car sequence))))) + ((>= count end) value)))))))