* Edi Weitz [2005-08-09 16:00+0200] writes:
(defun transpose-lists (lists) "Turn a list-of-lists on its side. If the rows are of unequal length, truncate uniformly to the shortest.
For example: (transpose-lists '((ONE TWO THREE) (1 2))) => ((ONE 1) (TWO 2))" (catch 'done (loop with result with collectors = (loop for list in lists collect (let ((list list)) (lambda () (cond ((null list) (throw 'done result)) (t (pop list)))))) collect (loop for collector in collectors collect (funcall collector)) into temp-result do (setq result temp-result))))
Uugh, how ugly :-)
How about?
(defun transpose-lists (lists) (cond ((some #'null lists) '()) (t (cons (mapcar #'car lists) (transpose-lists (mapcar #'cdr lists))))))