我正在编写一个简单的DiceRoller应用程序并且我已经创建了主要功能,但是我想知道是否有一种“智能”方法来验证Clojure中的函数输入而不是使用分支条件来验证输入?我的功能在下面进行了样本测试,我还必须测试n是不是一个数字与另一个if或an或者它感觉很乱。
此外,如果有人能指出更聪明的方式来执行此功能,我将不胜感激任何反馈,这是我尝试功能性编程的第一次尝试
(ns DiceRoller)
(defn roll
"rolls a specified number of n sided dice "
([] (roll 1 6))
([number] (roll number 6))
([number n]
(if-not number? number (throw (IllegalArgumentException. (str "incorrect input, integers only"))))
(take number (repeatedly #(+ (rand-int n) 1)))
)
)
答案 0 :(得分:23)
当然有 - 你可以使用:pre
断言。
(defn some-fun [x]
{:pre [(number? x)]}
(foo x))
现在,如果您将函数传递给非数字参数x
,那么您将获得 AssertionError Assert failed:(number?x)。
检查输入是否是一个数字是有用的,因为@amalloy已经指出,但是有很多完全有效的前置条件(以及后置条件)检查你可能想要应用于你的函数。您可以查看有关主题here和here的更多详细信息。
答案 1 :(得分:7)
大多数情况下,Clojure的态度是“只是假设你做对了事”。在这种情况下,如果您完全取出支票,用户最终会得到基本相同的异常。但如果你真的想这样做,你应该正确地做到这一点!现在你的代码会在每个输入上抛出一个异常,因为你遗漏了(number? number)
周围的问题。