1

我正在尝试用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 行,这使得放在一张地图上太笨拙了。

4

1 回答 1

3

您可以@(resolve sym)用作类似symbol-value工作;它实际上所做的是查找由sym当前命名空间中的符号命名的 Var(可能是使用use/引入的 Var require :refer)并提取其值。查看ns-resolve是否要控制查找 Var 的命名空间。

您也可以不使用 Var-per-location,而是将您的位置存储在某处的地图中:

(def locations {:hallway ... :bedroom ...})

(您也可以将此地图放在 Ref 中,以便在运行时添加新位置。)

于 2013-07-06T10:02:10.027 回答