代码之家  ›  专栏  ›  技术社区  ›  Soyuz

公共Lisp:制定关于输入值的规则

  •  4
  • Soyuz  · 技术社区  · 12 年前

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

    代码:

    (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,如果这有什么不同的话。

    1 回复  |  直到 12 年前
        1
  •  8
  •   Rainer Joswig Michael Fox    12 年前

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

    运行时的动态检查最好使用 CHECK-TYPE ASSERT

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

    这类似于:

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

    列表 (m n) 最后是一个变量列表,如果违反断言,用户可以交互设置这些变量。在输入不同的值之后,将再次检查断言,直到满足断言为止。