0
votes

Edit:

The answer to this is I was looking at the function, not loop parameters.

In the second of the following two functions, I cannot figure out why the recur thinks it so only supposed to be passed one argument.

CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2, compiling:(/home/cnorton/projects/clojure/clj_in_action/mr1/src/mr1.clj:84)

I am not seeing what is incorrect.

(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
OK I see the problem now. The loop only has one argument. I was looking at the function parameters. - octopusgrabbus
Maybe provide the answer to your own question as an answer instead of a comment. - Michiel Borkent
Actually, I was going to and the note with answering your own question said better to use a comment. - octopusgrabbus

1 Answers

3
votes

The important part is the section here:

(loop [mov moves] ...)

This code fragment is binding mov to moves from the outer function scope. The use of recur comes inside the loop though, so recur expects only one parameter according to the loop definition.