(rplaca tail (cdar tail)))
(collect (apply func elems))))))))
+(defun mapn (func list)
+ (with-collect
+ (while list
+ (collect (funcall func list))
+ (setq list (cdr list)))))
+
+(defun maplist (func list &rest lists)
+ (let ((lists (cons list lists)))
+ (with-collect
+ (block loop
+ (loop
+ (let ((elems (mapn #'car lists)))
+ (do ((tail lists (cdr tail)))
+ ((null tail))
+ (when (null (car tail)) (return-from loop))
+ (rplaca tail (cdar tail)))
+ (collect (apply func elems))))))))
+
(defun mapc (func &rest lists)
(do* ((elems (map1 #'car lists) (map1 #'car lists-rest))
(lists-rest (map1 #'cdr lists) (map1 #'cdr lists-rest)))
;; MAPCAR
(test (equal (mapcar #'+ '(1 2) '(3) '(4 5 6)) '(8)))
+;; MAPLIST
+(test (equal '((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3))
+ (maplist #'append '(1 2 3 4) '(1 2) '(1 2 3))))
+(test (equal '((FOO A B C D) (FOO B C D) (FOO C D) (FOO D))
+ (maplist #'(lambda (x) (cons 'foo x)) '(a b c d))))
+(test (equal '(0 0 1 0 1 1 1)
+ (maplist #'(lambda (x) (if (member (car x) (cdr x)) 0 1)) '(a b a c d b c))))
+
;; MAPC
(test (equal (mapc #'+ '(1 2) '(3) '(4 5 6)) '(1 2)))
(test (let (foo)