Я пробую свою руку в текстовом приключении в clojure.Доступ к глобальной переменной по ее названию в Clojure
Это где я борюсь:
(ns records)
(defrecord Room [fdesc sdesc ldesc exit seen])
(defrecord Item [name location adjective fdesc ldesc sdesc flags action ])
(def bedroom (Room. "A lot of text."
nil
"some text"
'(("west" hallway wearing-clothes? wear-clothes-f))
false))
(def hallway (Room. "description of room."
nil
"short desc of room."
'(("east" bedroom) ("west" frontdoor))
false))
(def location (ref bedroom))
(defn in?
"Check if sequence contains item."
[item lst]
(some #(= item %) lst))
(defn next-location
"return the location for a entered direction"
[direction ]
(second (first (filter #(in? direction %) (:exit @location)))))
(defn set-new-location
"set location parameter to new location."
[loc]
(dosync (ref-set location loc)))
Моя проблема с обновлением местоположения вар.
Если я вхожу (set-new-location hallway)
, он работает правильно. Местоположение установлено в новом помещении, и я могу получить доступ к его полям. Однако мне нужно прочитать следующий возможный выход из поля выхода комнаты, но когда я вхожу в (set-new-direction (next-exit "west"))
, местоположение говорит о коридоре, но оно не указывает на переменную «коридор».
В CL я бы использовал (коридор с символикой). Как я могу сделать это в Clojure?
EDIT: Я действительно хочу использовать var-per-location, потому что я набросал примерно 30 местоположений по 20 строк каждый, что делает его слишком громоздким для размещения на одной карте.
Как это должно работать? Если я попробую '(ref-set location @ (разрешить спальню))' I get 'ClassCastException records.Room не может быть добавлен в clojure.lang.Symbol clojure.core/ns-resolve (core.clj: 3954)'. – martin
Вам нужно будет сказать '@ (разрешить« спальню »' (обратите внимание на цитату), чтобы передать символ 'спальня' для' разрешения'. Конечно, если у вас есть какой-то конкретный символ, нет смысла делать это, и вы можете просто написать «спальня»; но если символ динамически вычисляется, например, при вызове 'next-location', то никакое дополнительное цитирование не понадобится:' @ (resolve (next-location «west»)). –