Почему Clojure recur считает, что у него должен быть только один аргумент? - PullRequest
0 голосов
/ 11 декабря 2011

Edit:

Ответ на этот вопрос - я смотрел на функцию, а не на параметры цикла.

Во второй из следующих двух функций я не могу понять, почему recur считает, что это должно быть передано только один аргумент.

CompilerException java.lang.IllegalArgumentException: несоответствующее количество аргументов для повторения, ожидаемое: 1 аргумент, получено: 2, компиляция: (/ home / cnorton / projects / clojure / clj_in_action / mr1 / src / mr1.clj: 84)

Я не вижу, что не так.

(defn determine-rover-move
    [rover-coord mov]

    (println rover-coord mov)
    (cond
        (= \L mov) (assoc rover-coord 0 (adj-compass-posL (first rover-coord)))
        (= \R mov) (assoc rover-coord 0 (adj-compass-posR (first rover-coord)))
        (= \M mov) (mov-rover rover-coord)

    ))


(defn execute-each-move
    [moves rover-coord]
    (loop [mov moves]
        (if (nil? mov)
            rover-coord
            (recur (rest moves) (determine-rover-move rover-coord mov)))))

1 Ответ

3 голосов
/ 12 декабря 2011

Важной частью является раздел здесь:

(loop [mov moves] ...)

Этот фрагмент кода привязывает mov к moves из области видимости внешней функции. Использование recur происходит внутри loop, поэтому recur ожидает только один параметр в соответствии с определением loop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...