в чем разница между "apply" и "mapcar" в Lisp

(defun describe-paths (location edges) 
(apply #'append (mapcar #'describe-path (cdr (assoc location edges)))))

2 ответов


в чем сходство? Или здесь скрывается еще один вопрос?

(ссылки из elisp, потому что это то, что я знаю. Цитаты - это просто выдержки, а ссылки содержат примеры, которые могут иметь или не иметь отношение к конкретному "Lisp".)

mapcar

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.)