我一直试图在Clojure中使用一个简单的循环来工作,我不知道如何去除异常。我正在尝试将arrange
函数写入向量中的exchange
项。这是代码。
(defn exchange [v i]
(let [[src dst] i]
(assoc v dst (v src) src (v dst))))
(defn arrange []
(loop [idxs [0 0]
deck [\a \b \c \d \e]
pts [[0 1] [2 3] [4 1]]]
(println idxs deck pts)
(empty? pts)
deck
(recur (first pts) (exchange deck idxs) (rest pts))))
;(arrange)
;[b e d c a]
如果我删除了println,我在REPL中看不到任何内容。我来自COBOL,所以你知道我很难接受这个:)任何建议,使这更加惯用,将不胜感激。
6 / 11-
这是更正后的代码。 arrange
循环中应该只有两个参数。
(defn arrange []
(loop [deck [\a \b \c \d \e]
lst [[0 1] [2 3] [4 1]]]
(if (empty? lst)
deck
(recur (exchange deck (first lst)) (rest lst)))))
甚至更好,请根据@Magos使用(reduce exchange deck lst)
!
答案 0 :(得分:2)
您错过了if
,并且需要在idxs
上结束循环,而不是pts
(或者您将错过最终的索引对):
(if (empty? idxs)
deck
(recur (first pts) (exchange deck idxs) (rest pts)))
应该更好。