如果我有一个哈希映射,并且我想将一个值与它相关联,并且我将该键作为参数,我该怎么办?
(defn define [name type kind] "define new var in one of the tables"
(if (or (= type "static") (= type "field"))
(def classScope (assoc classScope name (list type kind (addCount kind))))
(def methodScope (assoc methodScope name (list type kind (addCount kind))))
)
)
我的问题是我无法使用:name
,而不是'name
。
谢谢!
答案 0 :(得分:1)
更新:如果您希望密钥以关键字形式存在,只需在其上调用(id, example_foreign_key)
即可。
keyword
e.g。
(defn my-map-fn [name type kind]
(assoc some-map (keyword name) (some-fn type kind)))
注意你不应该在defn中使用def。看起来您想要保留数据地图,并且当您调用(my-map-fn "some-name" "some-type" "some-kind") => {:some-name some-val}
时,您希望在该地图中存储更多数据。我这样做的方法是使用原子(还有其他方法)。
define
这里的好处是你获得了原子更新,并且(defonce classScope (atom {})
(defonce methodScope (atom {}))
(defn define
"if you want a doc string it goes here"
[name type kind]
(swap! (if (#{"static" "field"} type) classScope methodScope)
#(assoc % name (list type kind (addCount kind)))))
的调用可能会发生在一起并不会很紧密。
答案 1 :(得分:0)
让我们从您的解释性评论开始:
我正在尝试创建一个类似于符号表的哈希映射:我会的 通过 name 标识每个变量,它将有一个列表 代码中的类型,种类和索引。
一些想法:
您可以将变量的名称视为
其中任何一个都可以作为地图条目的关键。把事情简单化。使用字符串。
每个范围都需要这样的表格。范围应该知道它的封闭范围。
描述符 static 和 field 不是类型;他们也不是 替代方案 - 比方说 - Java。
我建议您查看clojure.spec和typed Clojure,了解Clojure中如何处理类似的问题。