与参数clojure关联

与参数clojure关联,clojure,hashmap,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 methodSco

如果我有一个散列映射,我想将一个值关联到它,然后我得到一个键作为参数,我应该怎么做

 (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

谢谢

更新:如果你想让你的密钥以关键字的形式出现,只需对它们调用
keyword

(defn my-map-fn [name type kind]
  (assoc some-map (keyword name) (some-fn type kind)))
e、 g

注意不要在defn中使用def。看起来您希望保留一个数据映射,并且在调用
define
时,您希望在该映射中存储更多数据。我的一种方法是使用原子(还有其他方法)


这里的好处是,您可以获得原子更新和调用
define
,而这些调用可能发生在一起,但不会相互碰撞。

让我们从您的解释性评论开始:


我正在尝试创建一个类似于符号表的哈希映射:我会的 通过名称识别每个变量,它将有一个包含其名称的列表 代码中的类型、种类和索引

一些想法:

  • 不要使用变量特征列表;使用地图
  • 您可以将变量的名称视为

    • 普通的旧绳子
    • 象征
    • 关键词
    其中任何一个都可以作为地图条目的键。保持简单。使用字符串

  • 每个范围都需要这样一个表。范围应该知道它的封闭范围

  • 描述符static和field不是类型;他们也不是 比如说Java中的替代方案


我建议您看看Clojure如何处理类似的问题

你有很多奇怪的构造。首先,在函数的中间,通常不需要/希望<代码> DEF。其次,
assoc
可能会抱怨,因为您正在使用一个可能尚未实习的风险值。更详细地描述您的用例,提供示例数据和您尝试过的内容。我正在尝试创建一个类似于符号表的哈希映射:我将根据每个变量的名称来标识它,它将在代码中有一个包含其类型、种类和索引的列表。在roder中将变量添加到表中时,我定义了函数“define”,该函数获取变量的名称、种类和类型。我的问题是我想使用name的内容,例如“abc”作为键,但不能使用
name
,因为我将获取
abc
,而不是
:abc
。当然我不能用
:name
,因为我会得到
:name
,而不是
:abc
。有什么想法吗?你可以传递函数
关键字
一个字符串,它就会这样做。地图也可以使用字符串作为键。太好了,它可以工作!谢谢:)
swap
assoc
参与统一的更新模型,因此与其自己构建这个lambda,不如编写
(swap!(if…)assoc name[type kind(addCount kind)])
这不是我的问题。。我知道我不应该一次又一次地使用define,但这不是重点——问题在于如何添加一个由参数标识的新键——在本例中是name。如果name有val“hello”,我希望它是
:hello
,但是通过将它写为
name
(在assoc函数中)您将找不到它,例如它将是{hello(ab)}。如果我写
:name
它将是{:name(ab)},这是我的问题。@ReutSchremer
(关键字名称)
就是您想要的。。。我会更新答案。
(my-map-fn "some-name" "some-type" "some-kind") => {:some-name some-val}
(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)))))