использование `cons` внутри применить mapcar - PullRequest
2 голосов
/ 21 сентября 2019

В 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 для создания списков из строк, но я новичок в функциональном программировании.

Спасибо!

1 Ответ

7 голосов
/ 21 сентября 2019

Коаны Lisp были написаны программистами Maclisp задолго до появления Common Lisp.В Maclisp APPLY просто взял два аргумента, функцию и список аргументов.Common Lisp обобщил это, чтобы использовать синтаксис, который вы используете.Но в Maclisp вам пришлось явно вызывать CONS или LIST*.

...