как манипулировать записями? - PullRequest
4 голосов
/ 03 апреля 2012

Как манипулировать записями?

Где я могу найти примеры?

Я хочу создать последовательность для записей.например:

(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))))))

Спасибо!

Ответы [ 2 ]

5 голосов
/ 03 апреля 2012

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 голос
/ 03 апреля 2012

Ваша 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"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...