Объединение списков в Common Lisp - проблема с "и" - PullRequest
5 голосов
/ 01 июня 2011

Я пытаюсь создать функцию 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))

Я хотел бы знать, как исправить условный оператор для работы с and или что-то в этом роде.Я думаю, что проблема возникает из-за того, что and является макросом.Я также хотел бы знать, есть ли встроенная функция для этого уже.

1 Ответ

16 голосов
/ 01 июня 2011

Вы повторно реализуете mapcar

? (mapcar #'list '(1 2 3) '(4 5 6) '(7 8 9))
((1 4 7) (2 5 8) (3 6 9))
? (mapcar #'list '(1 2 3 4) '(5 6) '(7 8 9))
((1 5 7) (2 6 8))
? (mapcar #'+ '(1 2 3) '(4 5 6) '(7 8 9))
(12 15 18)
? (mapcar #'+ '(1 2 3 4) '(5 6) '(7 8 9))
(13 16)

Кстати, функция, которую вы хотите в своем коде вместо all, равна and

...