与参数clojure相关联

时间:2017-06-12 13:12:53

标签: clojure hashmap

如果我有一个哈希映射,并且我想将一个值与它相关联,并且我将该键作为参数,我该怎么办?

 (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。 谢谢!

2 个答案:

答案 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.spectyped Clojure,了解Clojure中如何处理类似的问题。