В Lisp Koans используется следующая форма здесь для транспонирования матрицы:
(defun transpose (L) (apply #'mapcar (cons #'list L)))
Когда я анализирую эту функцию, (cons #'list L)
возвращаетсписок '(#'list L1 L2 L3 ...)
, где L_i
- столбцы матрицы L
.Затем apply
раскрывает список, и теперь mapcar list
имеет в качестве аргумента столбцы L
в виде списков, что создает строки L
.
Интересно, есть ли какая-либо причина, кромедидактический пример принуждения нового ученика на Лиспе помнить и понимать использование cons
, а не просто писать
(defun transpose (L) (apply #'mapcar #'list L))
, поскольку L
уже является списком (из столбцов)(в виде списков), apply
добавит #'list
к спискам в L
перед их распаковкой.
Можно ли это еще больше упростить?Я думаю, что apply
необходим для распаковки аргументов, чтобы использовать mapcar
для создания списков из строк, но я новичок в функциональном программировании.
Спасибо!