Skip to content

Instantly share code, notes, and snippets.

@joekarma
Last active December 16, 2015 19:39
Show Gist options
  • Save joekarma/5486646 to your computer and use it in GitHub Desktop.
Save joekarma/5486646 to your computer and use it in GitHub Desktop.
(defun forgiving-subseq (seq &key (start 0) (seq-length (length seq)) (end seq-length))
(let ((empty-seq (subseq seq 0 0)))
(cond ((> start seq-length) empty-seq)
(t (subseq seq start (min seq-length end))))))
(defun group-seq (seq group-size)
(unless (and (>= group-size 1)
(integerp group-size))
(error "Group size must be an integer greater than zero."))
(loop with seq-length = (length seq)
for remaining-seq = seq then (forgiving-subseq remaining-seq :start group-size :seq-length (+ seq-length group-size))
while (not (emptyp remaining-seq))
collect (forgiving-subseq remaining-seq :end group-size :seq-length seq-length)
do (decf seq-length group-size)))
(group-seq #(1 2 3 4 5) 2)
;; => (#(1 2) #(3 4) #(5))
(group-seq "hello world" 5)
;; => ("hello" " worl" "d")
(group-seq '(a b c d e f g h i j k l m n o p q r s t u v w) 3)
;; => ((A B C) (D E F) (G H I) (J K L) (M N O) (P Q R) (S T U) (V W))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment