作者:叫我刘大贱 | 来源:互联网 | 2023-09-18 09:26
我在 grid.clj 文件中有一个矩阵的表示:
(-> (grid 10 10)
(toggle 2 3 4 5)
(off 2 3 4 5)
(on 2 3 4 5))
这是一个函数列表,第一个初始化一个网格,其他的修改它。
Clojures 的“代码即数据”应该可以让我通过在集合末尾添加一条指令来轻松修改该表示。列表是有序集合对吗?订单很重要。那么如何将指令添加到列表的末尾?
像这样的东西:
(def grid (read-string (slurp "grid.clj")))
(conj grid '(off 1 2 3 6))
但是我不能添加到列表的末尾,这是一个可作为代码评估的数据结构。如果我不能添加到用于代码(作为数据)的有序集合的末尾,它如何“编码为数据”?
回答
Clojure 通常不提供执行效率低下的集合操作。列表是链表。修改一个列表在头部很容易,在尾部很难(你必须沿着列表走下去,所以它至少是一个 O(n) 线性时间操作)。
Clojure 还提供了索引、有序、顺序数据结构的向量。添加到向量的末尾比线性时间更好,因此提供了此操作(通过conj
)。
这是用于“代码”还是“数据”无关紧要 - 确定您需要对集合执行的操作,并选择有效实现它们的集合类型。在这种情况下,载体是容器的最佳选择(没有其他信息)。