Ответ 1
Для этого существует простой способ:
(defun rotate (list-of-lists)
(apply #'mapcar #'list list-of-lists))
Ваша попытка всегда возвращает оригинал mat
. Исправьте свой отступ, и вы увидите, что возвращаемое значение из формы if
всегда выбрасывается.
Изменить: как это работает:
-
List
принимает любое количество аргументов и составляет его список. Его определение функции можно представить примерно так:(defun list (&rest arguments) arguments) ; exploit the automatic &rest construction
-
Mapcar
принимает функцию и любое количество списков, а затем делает новый список значений, созданных при вызове функции всегда с один элемент из этих списков. Пример:(mapcar #'foo '((A B) (C D)))
построит новый список, где первым элементом является результат(foo 'A 'C)
, а второй результат(foo 'B 'D)
. -
Apply
принимает расширительный список списков аргументов в качестве последнего аргумент. Это означает, что если вы дадите ему список в качестве последнего аргумент, этот список может быть "распространен" для создания отдельных аргументов для функции. Пример:(apply #'+ '(1 2 3))
имеет тот же эффект как(+ 1 2 3)
.
Теперь вы можете развернуть строку:
(apply #'mapcar #'list '((A B) (C D)))
= >
(mapcar #'list '(A B) '(C D))
= >
(list (list 'A 'C) (list 'B 'D))
= >
'((A C) (B D))