в чем разница между "apply" и "mapcar" в Lisp
(defun describe-paths (location edges)
(apply #'append (mapcar #'describe-path (cdr (assoc location edges)))))
2 ответов
в чем сходство? Или здесь скрывается еще один вопрос?
(ссылки из elisp, потому что это то, что я знаю. Цитаты - это просто выдержки, а ссылки содержат примеры, которые могут иметь или не иметь отношение к конкретному "Lisp".)
mapcar-это функция, которая вызывает свой первый аргумент с каждым элементом своего второго аргумента, в свою очередь. Второй аргумент должен быть последовательность.
применить (в вызывающих функциях)
применить функцию вызовов с аргументами, просто как funcall, но с одним отличием: последний из аргументов-это список объектов, которые передаются в функцию как отдельные аргументы, а не единым списком. Мы говорим, что применять распространяет этот список, так что каждый отдельный элемент становится аргументом.
счастливая кодирование.
на describe-paths
функция (из текстовой приключенческой игры в Земля сюсюкать!) генерирует описания для путей, идущих из заданного местоположения. 74-77 страницы Земля сюсюкать объясняет роль mapcar
и append
в Примере.
на (cdr (assoc location edges))
предоставляет список всех путей, идущих из местоположения, таких как эти для living-room
расположение:
((GARDEN WEST DOOR)
(ATTIC UPSTAIRS LADDER))
на mapcar
вызывает функцию describe-path
для каждый из путей, собирая по пути описания в списке, где каждый из подсписков-это описание пути:
((THERE IS A DOOR GOING WEST FROM HERE.)
(THERE IS A LADDER GOING UPSTAIRS FROM HERE.))
далее append
функция применяется к списку описаний пути, объединяя его в плоский список:
(THERE IS A DOOR GOING WEST FROM HERE. THERE IS A
LADDER GOING UPSTAIRS FROM HERE.)