в чем разница между "apply" и "mapcar" в Лиспе - PullRequest
8 голосов
/ 06 мая 2011
(defun describe-paths (location edges) 
(apply #'append (mapcar #'describe-path (cdr (assoc location edges)))))

Ответы [ 2 ]

11 голосов
/ 06 мая 2011

В чем сходство? Или здесь есть еще один вопрос?

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

MAPCAR

mapcar - это функция, которая вызывает свой первый аргумент с каждым элементом своего второго аргумента, в свою очередь . Второй аргумент должен быть последовательностью.

применяется (в функциях вызова)

применять функцию вызовов с аргументами, просто как funcall, но с одним отличием: последний из аргументов представляет собой список объектов, которые передаются в функцию как отдельные аргументы , а не как один список. Мы говорим, что apply расширяет этот список, так что каждый отдельный элемент становится аргументом.

Удачного кодирования.

4 голосов
/ 06 мая 2011

Функция describe-paths (из текстовой приключенческой игры в Land of Lisp !) Генерирует описания путей, идущих из заданного местоположения.Страница 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.)
...