8

単純なDiceRollerアプリケーションを作成し、プライマリ関数を作成しましたが、分岐条件を使用して入力を検証するのではなく、Clojureで関数入力を検証する「スマート」な方法があるかどうか疑問に思っています。私の関数は以下のサンプルテストであり、nが別のifまたは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 に答える