2017-06-12 92 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處理。