Common Lisp:制定有关输入值的规则

Soy*_*yuz 4 lisp predicate common-lisp

在编写一个谓词来测试一个数字是否可以被一定范围内的所有整数整除时,我想知道是否有可能通过"声明"符号制定关于输入的规则?

码:

(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))))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可能想指定输入值"n"必须小于"m".无论如何使用内置功能吗?我似乎无法使用Hyperspec上的声明标识符找到我想要的内容.

此外,我正在使用SBCL,如果这有所作为.

Rai*_*wig 8

Common Lisp不为参数类型提供静态类型检查.一些Common Lisp编译器将其作为扩展,最着名的是CMUCL和SBCL.这些静态类型检查使用由提供的变量类型的典型声明DECLARE.您需要查看各种类型的语法以查看可以声明的内容.

运行时的动态检查最好用CHECK-TYPE和完成ASSERT.

在这种情况下,我可能想指定输入值"n"必须小于"m"

这类似于:

(assert (and (numberp m) (numberp n) (< n m)) (m n))
Run Code Online (Sandbox Code Playgroud)

最后的列表(m n)是一个变量列表,如果断言被违反,则可以由用户以交互方式设置.输入不同的值后,将再次检查断言,直到满足断言.