【问题标题】:Wrong number of args passed to keyword when using recur使用 recur 时传递给关键字的参数数量错误
【发布时间】:2016-03-17 00:50:57
【问题描述】:

我是 Clojure 的新手。这是我的代码:

(defn startgame [room-id]
  (loop [rid room-id]
    (println (clojure.string/join " "(get-room-description rid)))
      (let [rid (keyword (read-line))]
        (if (= rid :0)
          "bye bye"
          (recur (rid)))
  ))) 

它编译得很好,但是当它到达recur(rid) 行时,它会抛出错误: IllegalArgumentException Wrong number of args passed to keyword: :1 clojure.lang.Keyword.throwArity (Keyword.java:97)

我花了几个小时寻找导致它的原因,但我找不到解决方案。我的循环有一个参数rid 所以recur 应该有一个?

【问题讨论】:

  • 什么是get-room-description
  • 这是另一个基于键从地图中获取元素的函数。类似于(获取键映射),但我不需要将映射作为参数传递。

标签: recursion clojure


【解决方案1】:
(defn startgame [room-id]
  (loop [rid room-id]
    (let [rid (keyword (read-line))]
      (if (= rid :0)
        "bye bye"
        (recur rid)))))

rid 不需要括号。

ridclojure.lang.Keyword 类型,所以我们不能将此变量用作函数(在这种情况下/有时您可以将关键字用作类似(:foo {:foo 10}) ;;=> 10 的函数)。

【讨论】:

  • 那么为什么我在官方文档中可以找到的每个示例都有括号?我不敢相信它是如此简单。好的。我现在看到了。如果有某种表达式,则需要 ()。
  • 让我们考虑下面的例子。 (loop [cnt 0] (if (= cnt 10) "bye bye" (do (println cnt) (recur (inc cnt))))) 。这是一个简单的递归示例,我们想将 cnt 变量从 0 计数到 10,因此我们需要在传递给 recur 函数之前增加 cnt 变量。所以这就是为什么我们有时需要()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 2011-02-20
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多