2012-07-19 2 views
2

나는 다음과 같은클로저에 유형 목록을 정의하는 방법은 무엇입니까?

(defrecord Foo [a b]) 

지금 내가

(def f (Foo. 10 20)) 

으로이 형식의 인스턴스를 선언 할 수 있도록 내 UDT를 정의 할 무언가를 갖고 싶어하지만, 내가 어떻게이의 배열과 같은 자바를해야합니까 클로제.

나는 new ArrayList<Foo>() (또는 뭔가 가깝다.)을 갖고 싶어서 Add 메서드를 반복적으로 호출하여 새로운 Foo를 목록에 추가 할 수있다.

그렇게 할 방법을 찾을 수 없습니다.

편집 :

내가 푸의 키에 내 물건을 매핑 할 Clojure에서 말할 필요

. 그래서, 나는

(defrecord Foo [a b c]) 
(def foo-data 
    [ "foo1" 1 8 
    "foo2" 2 7 
    "foo3" 3 6 
    "foo4" 4 5]) 

나는 doseq 이러한 액세스 할 수 있습니다하지만 내가 ArrayList를 만들 필요가 있고 형 푸의 그것의 ArrayList에 아웃 내 foo는 데이터를 이동 한 다음 할 말을하는 방법이 필요합니다 그런 다음 어떤 조작을 수행하는 으로 작업하십시오. 나는 그런 시나리오 벡터 같은 Clojure의 데이터 구조를 사용하는 것이 좋습니다 것입니다

user=> (import 'java.util.ArrayList) 
user=> (def data (ArrayList.)) 
#'user/data 
user=> (.add data (Foo. 10 20)) 

:로

답변

6

I 좋겠 사용하는 것이 좋습니다 내장 된 자동으로 생성자 함수 생성 Clojure의 기능 :

(defrecord Foo [a b]) 

(->Foo 1 2) ;; auto-generated constructor 
=> #user.Foo{:a 1, :b 2} 

는 그런 다음 구성 표준 Clojure의 고차 기능을 사용할 수 있습니다 어떤 컬렉션이든 Foo 님, 좋아요.

(def foo-data [["Bob" 2] 
       ["Fred" 4] 
       ["Len" 6]]) 

(into [] (map (partial apply ->Foo) foo-data)) 
=> (A vector of Foos with the provided data) 
3

그것은 간단 할 것입니다.

벡터 예 :

user=> (def data (atom [])) 
#'user/data 
user=> (swap! data conj (Foo. 10 20)) ;Add item to data vector 
+0

(def data (ArrayList.)), 이것은 ArrayList의 새 인스턴스를 선언 한 다음 데이터에 대해 add 메서드를 호출하고 있습니까? 이 경우 어떻게 벡터를 사용할 수 있습니까? 어떤예요? –

+0

예. 벡터 – Ankur

+0

의 예제를 추가했습니다. 데이터를 0으로 만들 때, 컴파일러에게 어떻게 타입 foo를 얻고 있는지 어떻게 말합니까? 그래서 나는 캐스팅을해야만합니다. 우리는 제초제를 또한 가지고 있습니까? –

1

강력하게 형식화 된 항목으로 ArrayList를 다시 전달할 필요가없는 경우 Clojure에서 데이터 구조를 조작하는 것이 가장 좋습니다. http://clojure.org/cheatsheet의 "Seq In, Seq Out"섹션을 참조하십시오. 예제를 통해 학습하는 것을 선호하는 경우 http://www.4clojure.com은 학습 자료 구조 변형에 아주 좋습니다.

관련 문제