如何在clojure中定义类型列表?

时间:2012-07-19 06:08:26

标签: clojure

我想要一些东西来定义我的UDT,所以

(defrecord Foo [a b])

现在我可以将此类型的实例声明为

(def f (Foo. 10 20))

但是我如何在clojure中使用类似java的数组。

我希望new ArrayList<Foo>()(或接近),以便我可以重复调用Add方法将新的Foo添加到列表中。

似乎无法找到办法。

编辑:

我需要告诉clojure将我的东西映射到Foo的键。所以,我需要一种方法来说明我的foo数据,然后创建一个类型为Foo的ArrayList

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

我可以通过doseq访问这些但是我需要创建一个ArrayList然后使用 要做一些操纵。

3 个答案:

答案 0 :(得分:6)

我建议使用内置的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)

答案 1 :(得分:3)

它将如此简单:

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

我建议在这种情况下使用像矢量这样的clojure数据结构。

矢量示例:

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

答案 2 :(得分:1)

如果您不需要将ArrayList传递回强力键入的内容,最好在Clojure中操作数据结构。我发现http://clojure.org/cheatsheet的“Seq In,Seq Out”部分是一个方便的参考。如果您希望通过示例学习,http://www.4clojure.com对于学习数据结构转换非常有用。