8

我正在编写一个简单的 DiceRoller 应用程序并创建了主函数,但是我想知道是否有一种“智能”方法来验证 Clojure 中的函数输入,而不是使用分支条件来验证输入?我的函数在下面带有一个示例测试,我还必须测试 n 是否不是另一个 if 或 an or 的数字,并且感觉很乱。

另外,如果有人能指出一种更聪明的方法来执行此功能,我将不胜感激任何反馈,这是我第一次尝试功能性编程

(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)))
  )
)
4

2 回答 2

24

当然有——你可以:pre为此使用断言。

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

现在你会得到AssertionError Assert failed: (number?x)如果你给函数传递一个非数字参数x

正如@amalloy 已经指出的那样,检查输入是否是数字有点没用,但是有很多完全有效的前置条件(和后置条件)检查您可能想要应用于您的函数。您可以在此处此处查看有关该主题的更多详细信息。

于 2013-01-27T06:59:52.357 回答
7

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

于 2013-01-27T00:35:57.593 回答