clojure 应该是“代码就是数据”,但我无法添加到列表的末尾?

Sha*_*ras -6 clojure

我在 grid.clj 文件中有一个矩阵的表示:

(-> (grid 10 10)
    (toggle 2 3 4 5)
    (off 2 3 4 5)
    (on 2 3 4 5))
Run Code Online (Sandbox Code Playgroud)

这是一个函数列表,第一个初始化一个网格,其他的修改它。
Clojures 的“代码即数据”应该可以让我通过在集合末尾添加一条指令来轻松修改该表示。列表是有序集合对吗?订单很重要。那么如何将指令添加到列表的末尾?
像这样的东西:

(def grid (read-string (slurp "grid.clj")))
(conj grid '(off 1 2 3 6))
Run Code Online (Sandbox Code Playgroud)

但是我不能添加到列表的末尾,这是一个可作为代码评估的数据结构。如果我不能添加到用于代码(作为数据)的有序集合的末尾,它如何“编码为数据”?

Ale*_*ler 8

Clojure 通常不提供执行效率低下的集合操作。列表是链表。修改一个列表在头部很容易,在尾部很难(你必须沿着列表走下去,所以它至少是一个 O(n) 线性时间操作)。

Clojure 还提供了索引、有序、顺序数据结构的向量。添加到向量的末尾比线性时间更好,因此提供了此操作(通过conj)。

这是用于“代码”还是“数据”无关紧要 - 确定您需要对集合执行的操作,并选择有效实现它们的集合类型。在这种情况下,载体是容器的最佳选择(没有其他信息)。