X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fsequence.lisp;h=be36e994fedeef7904f48a9c61b48c6b91dcb71f;hb=852666e17ad12f114ab5bb05a9d5ff065f8d72ff;hp=7f86a85127d71162fe0af2ed7d42b67197ac8f5a;hpb=ac02066a55d3a19c41a70ad5b71d02c49a28e282;p=jscl.git diff --git a/src/sequence.lisp b/src/sequence.lisp index 7f86a85..be36e99 100644 --- a/src/sequence.lisp +++ b/src/sequence.lisp @@ -13,6 +13,8 @@ ;; You should have received a copy of the GNU General Public License ;; along with JSCL. If not, see . +(/debug "loading sequence.lisp!") + (defun not-seq-error (thing) (error "`~S' is not of type SEQUENCE" thing)) @@ -176,3 +178,32 @@ ((= j b) new) (aset new i (aref seq j))))) (t (not-seq-error seq)))) + +(defun copy-seq (sequence) + (subseq sequence 0)) + + +;;; Reduce (based on SBCL's version) + +(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)) + (macrolet ((reduce-list (function sequence key start end initial-value ivp from-end) + `(let ((sequence + ,(if from-end + `(reverse (nthcdr ,start ,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))) + ,(if from-end + `(funcall ,function (funcall ,key (car sequence)) value) + `(funcall ,function value (funcall ,key (car sequence)))))) + ((>= count ,end) value))))) + (if from-end + (reduce-list function sequence key start end initial-value ivp t) + (reduce-list function sequence key start end initial-value ivp nil))))))