有没有一种智能的方法来验证Clojure中的函数输入?

时间:2013-01-26 23:35:10

标签: clojure validation

我正在编写一个简单的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)))
  )
)

2 个答案:

答案 0 :(得分:23)

当然有 - 你可以使用:pre断言。

(defn some-fun [x]
  {:pre [(number? x)]}
  (foo x))

现在,如果您将函数传递给非数字参数x,那么您将获得 AssertionError Assert failed:(number?x)

检查输入是否是一个数字是有用的,因为@amalloy已经指出,但是有很多完全有效的前置条件(以及后置条件)检查你可能想要应用于你的函数。您可以查看有关主题herehere的更多详细信息。

答案 1 :(得分:7)

大多数情况下,Clojure的态度是“只是假设你做对了事”。在这种情况下,如果您完全取出支票,用户最终会得到基本相同的异常。但如果你真的想这样做,你应该正确地做到这一点!现在你的代码会在每个输入上抛出一个异常,因为你遗漏了(number? number)周围的问题。