接收IllegalArgumentException的Clojure循环键必须是整数clojure.lang.APersistentVector.invoke

时间:2015-06-07 23:48:31

标签: clojure

我一直试图在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)

1 个答案:

答案 0 :(得分:2)

您错过了if,并且需要在idxs上结束循环,而不是pts(或者您将错过最终的索引对):

(if (empty? idxs)
  deck
  (recur (first pts) (exchange deck idxs) (rest pts)))

应该更好。