Архивирование списков вместе в Common Lisp — проблема с «и»

#list #function #macros #common-lisp

#Список #функция #макросы #common-lisp

Вопрос:

Что я пытаюсь сделать, так это создать функцию 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 amp;rest lists)
  (if (apply and lists) ; <- Here is where I think the problem is.
    (cons (apply f (mapcar #'car lists)) (zip f amp;rest (mapcar #'cdr lists)))
    nil))
  

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

Ответ №1:

Вы повторно внедряете 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

Комментарии:

1. Спасибо! Я не знал, mapcar что это можно сделать!

2. all Произошло случайно. Теперь, что я могу сделать, чтобы исправить условие?

3. (примените #’и списки); и удалите amp;rest из 2-го аргумента в cons

4. @Doug Currie: and это не функция в соответствии с clisp. Кроме того, теперь я понимаю, что вторым аргументом для cons должно быть (apply zip f (mapcar #’списки cdr)). Мне нужно, чтобы новые списки передавались как отдельные аргументы.

5. Есть несколько вариантов: (не все #’конечные списки) или (все #’ списки идентификаторов) приходят на ум.