Clojure函数错误“键必须是整数”

时间:2012-02-13 10:02:18

标签: clojure

我在这个函数中遇到了问题,尽管编译没有错误!

该函数获取两个长度为n的向量,另一个长度为2^n的向量和一个索引。该函数执行简单的计算,然后返回一个向量。

尝试调用该函数时出现问题。例如:

(check [1 2 3] [1 2 3] [1 2 3 4 5 6 7 8] 1)
java.lang.IllegalArgumentException: Key must be integer (NO_SOURCE_FILE:0)

功能定义:

(defn check [row1 row2 arr j]
  (
   (def x1 (nth arr (nth row1 j)))
   (def x2 (nth arr (nth row2 (- j 1))))
   (def x3 (nth arr (nth row1 (- j 1))))
   (if (<= x1 x2)
     (
      (def row1 (assoc row1 j x3))
      row1
      )
     ((def row1 (assoc row1 (- j 1) x2))
      row1)
     )
   )
  )

2 个答案:

答案 0 :(得分:7)

我清理了你的代码:

(defn check [row1 row2 arr j]
  (let [x1 (nth arr (nth row1 j))
        x2 (nth arr (nth row2 (- j 1)))
        x3 (nth arr (nth row1 (- j 1)))]
    (if (<= x1 x2)
        (assoc row1 j x3)
        (assoc row1 (- j 1) x2))))

我不知道这是否符合您的要求,但函数会进行评估,并返回合理的值,例如

user=> (check [1 2 3] [1 2 3] [1 2 3 4 5 6 7 8] 1)
[2 2 3]

答案 1 :(得分:5)

您可能应该先尝试解决以下问题:

  • 不要在函数中使用def,而应使用(let [name1 value1 name2 value2] ...)。 def实际上是用于在命名空间中定义某些内容,而不是用于本地值。
  • 您的let有语法问题,例如(let [row1 (assoc row1 j x3)] ...)
  • 第2行的括号表示您将(def x1 (nth arr (nth row1 j)))的结果作为函数调用。这几乎肯定不是你想要的。将defs转换成let应该有助于解决这个问题。