2012-04-03 12 views
4

レコードの操作方法は?レコードの操作方法は?

私はいくつかの例を見つけることができますか?

私はレコードにシーケンスを作りたいと思います。例えば :から点列を作成する方法

(defrecord Point [x y]) 

'[1 2] [3 4] [5,6]'?

と、ファイル内のデータストアの場合:レコードにこれらを読み込む方法

1 2 
3 4 
5 6 

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

ありがとう!

答えて

5

のClojureのdefrecordが定義されているタイプのためにいくつかのヘルパー関数を生成(Name. <args>)フォームを使用して、ポイントのインスタンスを作成することができます。彼らの目的は、一流のClojure市民としてそのタイプのコンストラクタを持つことです。特にdefrecord Pointは、マップをとり、(これはおそらく必要なものです)を生成します。位置指定の引数を取る->Pointです。だから、この:

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

は、この生成します

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

defrecordの宣言が正しいです。

その後、

;=> (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

をしかし私が欲しいのは、リストからポイントのシーケンスを作成しています。 '(def seq(apply。Point [[1 2] [3 4]])))'これは正しいとは知っています。 – Kane

+0

@JinZhang:関数 '(defn make-point [xy](Point。xy))'を定義すると、 '(map(partial apply make-point)[[1 2] [3 4]])' ' 。 – mange

+0

ありがとうございます。これを行うもっと便利な方法はありますか?機能を定義することなく。上で述べたように、ファイルからすべてのデータを読み込み、ポイントシーケンスに変換する必要があります。 – Kane

関連する問題