如何在clojure中创建列表数组?

如何在clojure中创建列表数组?,clojure,Clojure,因此,我正在开发一个编译器lexer,并使用 (生成数组行) 其中,行是列表列表的列表 但是,我在创建800*127*'()行的高嵌套列表时遇到了内存问题,然后将其转换回数组 有没有办法创建一个空的二维数组,然后用列表动态设置其单元格?每个单元格的列表大小不一样。如果您实际上不需要将每个值初始化为clojure.lang.PersistentList$EmptyList(aka”()),则可以这样简单: (make-array clojure.lang.PersistentList 800 12

因此,我正在开发一个编译器lexer,并使用
(生成数组行)
其中,行是列表列表的列表

但是,我在创建800*127*'()行的高嵌套列表时遇到了内存问题,然后将其转换回数组

有没有办法创建一个空的二维数组,然后用列表动态设置其单元格?每个单元格的列表大小不一样。

如果您实际上不需要将每个值初始化为
clojure.lang.PersistentList$EmptyList
(aka
”()
),则可以这样简单:

(make-array clojure.lang.PersistentList 800 127)

…尽管如此,我并不特别推荐它。有什么原因不能使用向量向量吗?

我假设您没有可用的内存来使用向量?使用数组意味着你失去了STM系统的好处。我打赌数组是稀疏的-大多数条目都是无效的。因为几乎所有的州都会有至少一个出口转换,所以你可以用一个列表数组来紧凑地表示数组,用它的目标id标记每个条目。这是难以置信的访问速度-你会在现实生活中使用一个映射,但是列表应该让你在内存条下。是的!我最后做了那件事。它就像一个符咒。速度较慢,但至少它编译并运行了。这很有效。但是,在为每个单元格分配任务后,我的内存仍然不足。我现在要尝试一种不同的技术。但是,谢谢。我不能使用向量的原因很愚蠢。这是家庭作业的一部分,根据规范,我们应该创建一个clojure数组,由NFA的转换函数(make array)或(to-array-2d)返回。我们不允许使用向量。