From 168079daa86cefc7f1f8d0845887ed6e63f6ff74 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20V=C3=A1zquez?= Date: Thu, 20 Jun 2013 14:22:18 +0200 Subject: [PATCH 1/1] Shorter reduce implementation --- src/sequence.lisp | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/sequence.lisp b/src/sequence.lisp index 789a7c3..8b3708b 100644 --- a/src/sequence.lisp +++ b/src/sequence.lisp @@ -180,26 +180,28 @@ (defun copy-seq (sequence) (subseq sequence 0)) -;;; Based on the SBCL's reduce implementation + +;;; 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)) - (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))))))) + (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)))))) -- 1.7.10.4