好吧,是的。属性列表的数据结构本质上是一个嵌套映射(至少从我对你的例子的理解来看,我对原始的属性列表并不熟悉)。哈希表在Clojure内是内置的,并且非常容易使用。它们可以接受任何值作为键和值。
更多不同的是,你给出的例子是可变的。这当然可以使用下面的atom
来实现,但Clojure的一个主要特点是实现可变性的语法很笨拙。
然而,这里有一份按照你概述的内容运行的工作
(def db (atom {}))
(defn put [word prop value]
(swap db assoc-in [word prop] value))
(defn get' [word prop]
(get-in @db [word prop]))
(defn symbol-plist [word]
(keys (get-in @db [word])))
另一件事是,人们通常使用:keywords
而不是'symbols'
,因为如果不加引号,符号通常会尝试以令人烦恼的方式解析。对于列表来说,也是同样的情况。在字面数据结构中,集合通常作为向量(或集合)存在。
在你的例子中构建的数据可以表示为
{'fly {'noun '(a buzzing little bug)
'verb 'transitive}}
这种数据结构是不可变的。symbol-plist 等于 (keys (get the-structure 'fly))
,get 是 (get (get ... 'fly) 'verb)
或者 (get-in ... ['fly 'verb])
。
Put 是 (assoc-in ... ['fly 'adjective] 'nah-not-really)
但是你必须保存引用,要么在执行期间的闭包中,就像
(let [db {'fly {'noun '(a buzzing little bug) 'verb 'transitive}}
db (assoc-in db ['cat 'noun] '(a little furry animal))
...]
db)
或者在第一个代码块中概述的原子中。
常规方法是用关键词(而不是符号)作为属性值,但没有什么阻止你使用符号。