【问题标题】:Why does Clojure recur think it should only have one argument?为什么 Clojure recur 认为它应该只有一个参数?
【发布时间】:2011-12-11 19:32:03
【问题描述】:

编辑:

这个问题的答案是我在看函数,而不是循环参数。

在以下两个函数中的第二个中,我无法弄清楚为什么 recur 认为它只应该传递一个参数。

CompilerException java.lang.IllegalArgumentException:重复参数计数不匹配,预期:1 args,得到: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)))))

【问题讨论】:

  • 好的,我现在看到了问题。循环只有一个参数。我在看函数参数。
  • 也许提供您自己问题的答案而不是评论。
  • 其实,我本来打算去的,回答你自己问题的注释说最好使用评论。

标签: clojure


【解决方案1】:

重要的部分是这里的部​​分:

(loop [mov moves] ...)

此代码片段从外部函数范围将mov 绑定到movesrecur 的使用在 loop 内部,因此根据 loop 定义,recur 只需要一个参数。

【讨论】:

  • “moves”在技术上不是 Clojure Var 中的 var,而只是一个符号,绑定到由对“execute-each-move”的函数调用提供的值
  • 感谢您的回答和评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2021-01-30
  • 2022-01-24
相关资源
最近更新 更多