【发布时间】: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