Помещение в REPL и запуск трассировки:
user> (ns foo (:use clojure.contrib.trace))
nil
На этом этапе я копирую ваш код в REPL.(не показано)
Далее я запускаю трассировку:
foo> (dotrace [describe-location describe-path-raw describe-path describe-paths]
(describe-paths :attic *edges*))
TRACE t1662: (describe-paths :attic {:living-room ((garden west door) (attic upstairs ladder)), :garden (living-room east door), :attic (living-room downstairs ladder)})
TRACE t1663: | (describe-path-raw living-room)
; Evaluation aborted.
foo>
Итак, проблема в том, что (описать-путь-необработанную гостиную).Как указывается в сообщении об ошибке, гостинная является символом, и эта функция пытается сделать что-то вроде вызова last и second для него, что можно сделать только для последовательностей.
Так почемуэто происходит?
Внутри описываемых путей, которые вы называете (края местоположения).Здесь местоположение: чердак, а ребра - это карта.Таким образом, (расположение краев) подходит для (гостиная вниз по лестнице).Вы отображаете в этот список description-path-raw, который работает так:
((describe-path-raw living-room) (describe-path-raw downstairs) (describe-path-raw ladder))
И это вызывает исключение при первом вызове, так как гостиная - это символ, а не последовательность.