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 上的声明标识符找到我想要的东西。

另外,我正在使用 SBCL,如果这有影响的话。

4

1 回答 1

8

Common Lisp 不提供参数类型的静态类型检查。一些 Common Lisp 编译器将其作为扩展,最值得注意的是 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 回答