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

ash*_*ina 2 clojure

我希望有一些东西可以定义我的UDT,如下所示

(defrecord Foo [a b])
Run Code Online (Sandbox Code Playgroud)

现在我可以声明这种类型的实例

(def f (Foo. 10 20))
Run Code Online (Sandbox Code Playgroud)

但是我如何在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])
Run Code Online (Sandbox Code Playgroud)

我可以通过doseq访问这些,但后来我需要创建一个ArrayList,然后使用它来做一些操作.

mik*_*era 6

我建议使用内置的Clojure功能,它自动创建一个构造函数:

 (defrecord Foo [a b])

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

然后你可以使用标准的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)
Run Code Online (Sandbox Code Playgroud)