4

数値が特定の範囲のすべての整数で割り切れるかどうかをテストする述語をコーディングしているときに、おそらく「宣言」記号を使用して、入力に関するルールを作成できるかどうか疑問に思いました。

コード:

(defun integer-divisiblep (n m i)   
  (declare (integer n m i))
  (do ((x m (- x 1)))           
      ((< x n) (return t))
    (when (not (integerp (/ i x)))
      (return nil))))

この場合、入力値「n」は「m」より小さくなければならないことを指定したいと思います。組み込みの関数でこれを行う方法はありますか?Hyperspecのdeclaration-identifiersで必要なものが見つからないようです。

また、違いがあれば、SBCLを使用しています。

4

1 に答える 1

8

Common Lispは、引数型の静的型チェックを提供しません。一部のCommonLispコンパイラは、拡張機能としてそれを実行します。特に、CMUCLとSBCLです。これらの静的型チェックは、によって提供される変数型の一般的な宣言を使用しますDECLARE。何を宣言できるかを確認するには、さまざまなタイプの構文を確認する必要があります。

実行時の動的チェックは、CHECK-TYPEとを使用して行うのが最適ASSERTです。

この場合、入力値「n」は「m」より小さくなければならないことを指定したいと思います。

これは次のようなものです。

(assert (and (numberp m) (numberp n) (< n m)) (m n))

最後のリスト(m n)は、アサーションに違反した場合にユーザーがインタラクティブに設定できる変数のリストです。別の値を入力した後、アサーションが満たされるまで、アサーションが再度チェックされます。

于 2012-07-15T13:40:28.610 に答える