【问题标题】:Illegal Argument Exception - Clojure非法参数异常 - Clojure
【发布时间】:2011-11-15 03:14:22
【问题描述】:

我有一些 Clojure 代码,看似简单得令人发狂,但却抛出了 IllegalArgumentException。作为参考,以下代码显示了我一直在编写的 4 个函数。我的错误在于第四个。

"Determine candy amount for first parameter. Returns even integers only (odd #'s rounded up)."
(defn fun1 [x y] (if (= (rem (+ (quot x 2) (quot y 2)) 2) 1) (+ (+ (quot x 2) (quot y 2)) 1) (+ (quot x 2) (quot y 2))))

"Play one round. Returns vector with new values."
(defn fun2 [[x y z t]] (vector (fun1 x z) (fun1 y x) (fun1 z y) (+ t 1)))

"Yield infinite sequence of turns."
(defn fun3 [[x y z t]] (if (= x y z) (vector x y z t) (iterate fun2 [x y z t])))

(defn fun4 [[x y z t]] (take-while #(not= %1 %2 %3) (fun3 [x y z t])))

第四个函数调用第三个函数,直到 x y 和 z 值不相等。代码编译正确,但我在 REPL 中得到以下序列:

Clojure 1.1.0
user=> (load-file "ass8.clj")
#'user/fun4
user=> (fun4 [10 10 10 1])
java.lang.IllegalArgumentException: Wrong number of args passed to: user$fun4--21$fn
(user=> (fun4 [[10 10 10 1]])
java.lang.IllegalArgumentException: Wrong number of args passed to: user$fun4--21$fn
(user=> (fun4 10 10 10 1)
java.lang.IllegalArgumentException: Wrong number of args passed to: user$fun4 (NO_SOURCE_FILE:0)

只有第一个表达式是正确的,但我的意思是我已经尝试了所有可能的组合。任何人都可以阐明这个神秘的错误吗?可能在您自己的 Clojure 环境中对其进行测试..?

附带说明,当 x = y = z 时 fun3 不应该停止吗?它现在似乎给出了一个无限序列,所以 if 似乎是多余的。

【问题讨论】:

    标签: exception parameters clojure anonymous-function


    【解决方案1】:

    根据您上面的评论,您可以使用以下代码(将现有代码用于 fun1)

    (defn fun2 [v] 
            (loop [[a b c d] v] 
                  (if (= a b c) 
                      [a b c d] 
                  (recur [(fun1 a c) (fun1 b a) (fun1 c b) (+ d 1)]))))
    

    你真的不需要 fun3 和 fun4

    【讨论】:

      【解决方案2】:

      take-while 的工作方式类似于 map,它一次从集合中获取一个值并检查谓词(即谓词将获取一个参数)。

      【讨论】:

        【解决方案3】:

        我不确定您要做什么,但对我来说 (fun3 [10 10 10 1]) 计算结果为 [10 10 10 1]

        由于这只是一个普通的旧向量,因此调用匿名函数的第一件事就是数字 10,而它需要 3 个参数。

        【讨论】:

        • 在写下我的回复时,我意识到根本问题是什么。基本上,当三个值(例如 10 10 10)相等时,“游戏”应该停止。为此,我想让 fun4 成为一个暂停执行,直到 x y 和 z(来自 fun3 的返回值)相等。我想让函数 3 自己执行此操作,但我不确定如何使用解构向量返回值进行条件检查。
        猜你喜欢
        • 2020-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多