2012-04-03 10 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 генерирует некоторые вспомогательные функции для определяемого типа. Их целью является создание конструкторов такого типа, как первоклассные граждане Clojure. В частности, defrecord Point генерирует map->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 верна.

Вы можете создать экземпляры вашей точки с помощью (Name. <args>) формы

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

Спасибо. Есть ли более удобный способ сделать это? без определения функции. как я уже упоминал выше, мне нужно прочитать все данные из файла и преобразовать его в последовательности точек. '(with-open [rdr (файл clojure.java.io/reader)] (doall (_____ (line-seq rdr))))))' – Kane

Смежные вопросы