【发布时间】:2016-06-19 17:09:55
【问题描述】:
在 Clojure 中是否有一种快速的方法,无需使用 recur,即可将一个 assoc 连续多次应用于一个元素?
也就是说,类似于:
(defn set-thing
[foo i val]
(assoc foo i val))
(let [foo [3 4 2 5 8]]
(last (for [i (range 0 (count test))]
(set-thing foo i 32)))
上面的代码,但是显然不符合我的要求。上面的函数将简单地返回一个向量,其中最后一个值为 32,其余的保持不变。我所追求的是返回一个所有值都设置为 32 的向量。
绝对有必要使用 set 函数,因为我的代码看起来与上面的代码有很大不同:从而阻止使用 map.实际代码在结构上的结构中包裹得很深。
不使用recur是否可以再次达到这个效果?
编辑:
这是一段使用循环和递归的代码,做我想做的事情。
(defn fill!
"Fills the terminal with one specific tile."
[{:keys [screen] :as term} tex-x tex-y color]
(let [grid-width (screen :grid-width)
grid-height (screen :grid-height)]
(loop [x 0
y 0
term term]
(if (= x grid-width)
(if (= y grid-height)
term
(recur 0 (inc y) ((term :set-char!) term x y tex-x tex-y color)))
(recur (inc x) y ((term :set-char!) term x y tex-x tex-y color))))))
文档注释中的“终端”是指我正在研究的一个库,它应该模拟一个终端,可以用于应用程序开发。
【问题讨论】:
-
set函数的目的是什么?它掩盖了clojure.core/set,似乎只是assoc的一个不太有用的版本。 -
我拥有的代码要高级得多,其中 set 函数的名称实际上并未设置。相反,我有一个 set 函数(如果你愿意的话),在瓦片网格中设置一个瓦片(在 x、y、tex-x、tex-y 和颜色参数的帮助下),返回应用程序的当前状态。因此,我要做的是遍历整个 x 和 y 坐标网格,将所有图块设置为相同类型的图块:因此需要一个 set 方法。
标签: clojure