Ошибка функции Clojure "Ключ должен быть целым числом" - PullRequest
0 голосов
/ 13 февраля 2012

У меня проблема с этой функцией, хотя она компилируется без ошибок!

Функция получает два вектора одинаковой длины 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 ]

7 голосов
/ 13 февраля 2012

Я очистил ваш код до этого:

(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]
5 голосов
/ 13 февраля 2012

Возможно, вам следует попытаться исправить следующие проблемы прежде всего:

  • Не используйте def внутри функции, вместо этого следует использовать (let [name1 value1 name2 value2] ...).def действительно для определения чего-либо в пространстве имен, а не для локальных значений.
  • У вас есть проблема с синтаксисом, это должно быть (let [row1 (assoc row1 j x3)] ...), например,
  • . Скобки в строке 2 означают, что выВызываем результат (def x1 (nth arr (nth row1 j))) как функцию.Это почти наверняка не то, что вы хотите.Преобразование defs в let должно помочь решить эту проблему.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...