2012-04-03 12 views
4

Wie man Datensätze manipuliert?Wie man Datensätze manipuliert?

Wo finde ich einige Beispiele?

Ich möchte eine Sequenz zu einem Datensatz machen. zum Beispiel:

(defrecord Point [x y]) 

, wie eine Folge von Punkten aus machen, '[[1 2] [3 4] [5 6]]?

und wenn der Datenspeicher in einer Datei:

1 2 
3 4 
5 6 

, wie diese in die Aufzeichnungen zu lesen?

(with-open [rdr (clojure.java.io/reader file)] 
    (doall (? (line-seq rdr)))))) 

Vielen Dank!

Antwort

5

Clojure des defrecord einige Hilfsfunktionen für den Typen definiert werden erzeugt. Ihr Zweck ist es, Konstrukteure für den Typ als erstklassige Clojure-Bürger zu haben. Insbesondere defrecord Point generiert map->Point, die eine Karte nimmt und (diese ist wahrscheinlich, was Sie brauchen) ->Point, die Positionsargumente nimmt. So folgt aus:

(defrecord Point [x y]) 
(map (partial apply ->Point) [[1 2] [3 4]]) 

erzeugt dies:

(#user.Point{:x 1, :y 2} #user.Point{:x 3, :y 4}) 
1

Ihre defrecord Erklärung ist korrekt.

Sie können dann Instanzen Ihres Punkt erstellen, die mit (Name. <args>) Form

;=> (defrecord Point [ x y ]) 
user.Point 
;=> (def p (Point. 1 2) 
#user.Point{:x 1, :y 2} 

; records have access of members 'as-if' they were a hash 
; (but more efficient) 
;=> (:x p) 
1 

; sequence of points...  
;=> [(Point. 1 2)(Point. 3 4)(Point. 5 6)] 
[#user.Point{:x 1, :y 2} #user.Point{:x 3, :y 4} #user.Point{:x 5, :y 6}] 

; read from a whitespace separated file 
;=> (with-open [rdr (clojure.java.io/reader file)] 
     (doall (for [[x y] (map #(re-seq #"\w+" %) (line-seq rdr))] 
     (Point. x y)))) 
(#user.Point{:x "1", :y "2"} #user.Point{:x "3", :y "4"} #user.Point{:x "5", :y "6"}) 
+0

aber was ich will, ist ein Folgen von Punkten aus einer Liste machen. etwas wie '(def seq (apply (Point.) [[1 2] [3 4]]))" Ich weiß, das ist nicht korrekt. – Kane

+0

@JinZhang: Definieren Sie eine Funktion '(defn make-point [xy] (Point. Xy))', dann können Sie '(map (partially apply make-point) [[1 2] [3 4]])' verwenden . – mange

+0

Danke. Gibt es einen bequemeren Weg, dies zu tun? ohne eine Funktion zu definieren. Wie ich oben erwähnt habe, muss ich alle Daten aus einer Datei lesen und in eine Punktsequenz umwandeln. '(mit-öffnen [rdr (clojure.java.io/reader file)] (doall (_____ (line-seq rdr)))))' – Kane

Verwandte Themen