2011-12-11 55 views
0

編輯:爲什麼Clojure會認爲它應該只有一個參數?

答案是我在看函數,而不是循環參數。

在以下兩個函數中的第二個函數中,我無法弄清楚爲什麼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

好的,我現在看到問題了。循環只有一個參數。我在看功能參數。 – octopusgrabbus

+1

也許提供您自己的問題的答案作爲答案,而不是評論。 –

+0

實際上,我打算和回答你自己的問題的說明說更好地使用評論。 – octopusgrabbus

回答

3

最重要的部分是這裏的部​​分:

(loop [mov moves] ...) 

此代碼片段從外部函數範圍結合movmovesrecur的使用在loop之內,所以根據loop的定義,recur僅需要一個參數。

+0

「移動」在技術上不是一個像Clojure Var那樣的變量,而只是一個綁定到函數調用「execute-each-move」提供的值的符號。 –

+0

感謝您的回答和評論。 – octopusgrabbus

相關問題