2017-06-12 89 views
0

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

(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

你有一些好奇的构造。首先,通常不需要/不需要在函数中间进行“确定”。其次,当你使用一个可能还没有实习的变种时,assoc可能会抱怨。详细描述您的用例,提供样例数据以及您尝试的内容。 –

+0

我试图创建一个像符号表一样的哈希映射:我将通过它的名称来标识每个变量,并且它将在代码中包含它的类型,类型和索引。 在roder中添加一个变量到表中,我已经定义了函数'define',谁获取变量的名称,种类和类型。 –

+0

我的问题是我想使用名称的内容,例如“abc”作为键,但不能使用'name',因为我会得到'abc'而不是':abc'。当然我不能使用':name',因为我会得到':name'而不是':abc'。 有什么想法? –

回答

1

更新:如果你希望你的钥匙是在关键字的形式,只要求他们keyword ....

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

例如

(my-map-fn "some-name" "some-type" "some-kind") => {:some-name some-val} 

注意,你不应该DEFN内DEF使用。它看起来像你想保留一个数据地图,当​​你打电话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))))) 

这里的好处是你可能不会硬碰硬发生真正并拢原子更新和define电话。

+0

'swap!'和'assoc'参与统一更新模型,所以不用自己构建这个lambda,而是写好'(swap!(if ...)assoc name [type kind(addCount kind )])' – amalloy

+0

这不是我的问题..我知道我不应该一遍又一遍地使用define,但这不是重点 - 问题是如何添加一个由参数标识的新密钥 - 在这种情况下,名称。如果name有val“hello”,我希望它成为':hello',但是通过将它写为'name'(在assoc函数中),你不会找到它,它将会是{hello(a b)} for ex。如果我写':name',它将是{:name(a b)},这就是我的问题。 –

+0

@ReutSchremer'(关键字名称)'是你想要的,然后...我会更新答案。 –

0

让我们先从你的解释性注释:

我试图创建一个哈希映射,像一个符号表:其名字我会 识别每一个变量,它会产生清单 类型,索引在代码中。

的一点想法:

  • 不要使用变量的特性列表;使用地图
  • 你可以把一个变量的名称作为

    • 一个普通的老串
    • 象征
    • 关键字

    所有这些作品作为地图的关键条目。把事情简单化。使用一个字符串。

  • 你将需要为每个范围这样的表。范围应该知道它的封闭范围。

  • 描述符静态字段不是类型;在Java中,它们也不是它们的替代品。

我建议你看看clojure.spectyped Clojure看问题的相似程度内的Clojure处理。