2016-07-05 15 views
1

erklärte ich eine Karte in clojureanhängen Werte in einer globalen Karte in clojure

   (def finalMap {}) 

Ich anhängen Wert, um es in einer Funktion mit Assoc verwenden, aber sie sind Anfügen nicht, wird die Karte leer bleiben. Ich denke, es liegt an der Unveränderlichkeit, kann ich irgendwie eine globale Karte veränderbar machen. Die Funktion ist eine rekursive und ich hänge Werte jedes Mal an, wenn die Funktion aufgerufen wird.

  (defn func [arg1 arg2] 
      ;(map append inside let) 
      (dorun (for [i (range 0 index)] 
       (do 
       (func(arg1 arg2)))))) 

Können Sie mir mit dem richtigen Weg helfen, dies zu tun?

+0

die Lösung für dieses ist, Atom zu verwenden, wie in der Antwort vorgeschlagen. Wichtiger ist, was ist dein Endziel? Könnten Sie den Kontext angeben, in dem die Funktion verwendet wird? Vielleicht gibt es eine bessere Lösung, die keine veränderbaren Daten enthält. – leetwinski

+0

übrigens: '(dorun (für [i (range 0 index)] ... könnte auf' (dimimes [i index] ... ') verkürzt werden, und' do' in 'dorun' ist veraltet, da der Körper von 'do *' Makros wird in einem impliziten 'do' Block ausgewertet – leetwinski

+0

Eigentlich habe ich gerade angefangen clojure zu benutzen und habe einen Java Code in clojure konvertiert.Ich habe diese Funktion genau so implementiert, wie ich es in Java getan habe ein Weg in clojure, um dies zu tun, ohne veränderbare Karten zu verwenden. – user3083633

Antwort

1

Wenn Sie eine wandelbar Karte dann sollten Sie ein Atom erstellen:

(def final-map (atom {})) 

Auch normalerweise würden Sie assoc verwenden, um mehr Schlüsselwert-Paaren, um es hinzuzufügen. Allerdings müssen Sie swap! verwenden, nur um in der Lage assoc zu nennen:

(swap! final-map assoc :a "a value") 

Dies wird ein Schlüssel/Wert-Paar hinzufügen, wo der Schlüssel ist das Schlüsselwort :a und der Wert ist der String „ein Wert“.

Es könnte gut sein, einige andere examples of using assoc zu sehen. Verwirklichen Sie, dass in dem obigen Code assoc mit dem alten Wert von final-map als sein erstes Argument aufgerufen wird, und den neuen Wert von final-map zurückgibt.

+0

Yeah danke. Ich tat dasselbe mit ref. Es funktioniert jetzt. – user3083633

+0

Sie können ganze Anwendungen mit nur einem Atom schreiben.Und wenn Sie nur eine haben, dann gibt es keine Notwendigkeit Um einen Verweis zu verwenden: siehe [hier] (http://tarynsauer.tumblr.com/post/77631451200/clojure-should-i-use-atoms-or-refs) - und erkennen, dass der Autor nicht zwei Atome verwenden musste - er/sie hätte das Atom als Karte mit zwei Schlüssel/Wert-Paaren haben können –

+0

Oh, ich werde es mir anschauen. Danke. – user3083633

Verwandte Themen