我正在尝试用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)))
我的问题是更新 var 位置。
如果我输入(set-new-location hallway)
它可以正常工作。位置设置为新房间,我可以访问它的字段。但是,我需要做的是从房间的出口字段中读取下一个可能的出口,但是当我进入(set-new-direction (next-exit "west"))
位置时说走廊,但它并不指向变量“走廊”。
在 CL 中,我会使用(符号值走廊)。我怎样才能在 Clojure 中做到这一点?
编辑:我真的很想使用 var-per-location 因为我已经勾勒出大约 30 个位置,每个位置有 20 行,这使得放在一张地图上太笨拙了。