嗯,是的。属性列表的数据结构本质上是一个嵌套映射(至少从我分析你的示例来看是如此,我对原始属性列表不是特别熟悉)。哈希表在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)
或者在第一个代码块中概述的atom中。
习惯用法是使用关键字(而不是符号)作为属性值,但这并不能阻止你使用符号。