我在 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)
但是我不能添加到列表的末尾,这是一个可作为代码评估的数据结构。如果我不能添加到用于代码(作为数据)的有序集合的末尾,它如何“编码为数据”?
Clojure 通常不提供执行效率低下的集合操作。列表是链表。修改一个列表在头部很容易,在尾部很难(你必须沿着列表走下去,所以它至少是一个 O(n) 线性时间操作)。
Clojure 还提供了索引、有序、顺序数据结构的向量。添加到向量的末尾比线性时间更好,因此提供了此操作(通过conj)。
这是用于“代码”还是“数据”无关紧要 - 确定您需要对集合执行的操作,并选择有效实现它们的集合类型。在这种情况下,载体是容器的最佳选择(没有其他信息)。
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |