Я пытаюсь создать функцию zip
( обратите внимание, что это не домашнее задание), который выполняет итерацию по нескольким спискам одновременно, применяя функцию к каждому списку элементов, например:
(zip f '(1 2 3) '(4 5 6) '(7 8 9)) = (list (f 1 4 7) (f 2 5 8) (f 3 6 9))
(zip f '(1 2 3 4) '(5 6) '(7 8 9)) = (list (f 1 5 7) (f 2 6 8))
По сути, он останавливается, когда в любом списке заканчиваются элементы. Вот моя текущая попытка:
(defun zip (f &rest lists)
(if (apply and lists) ; <- Here is where I think the problem is.
(cons (apply f (mapcar #'car lists)) (zip f &rest (mapcar #'cdr lists)))
nil))
Я хотел бы знать, как исправить условный оператор для работы с и
или что-то в этом роде. Я думаю, что проблема возникает из-за того, что и
являются макросами. Я также хотел бы знать, есть ли уже встроенная функция для этого.