Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Common Lisp: making rules about input values

While coding a predicate that tests whether or not a number is divisible by all integers across a certain range, I was wondering if it is possible to make rules about input, maybe through the "declare" symbol?

Code:

(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))))

In this case I may like to specify that the input value "n" must be smaller than "m". Is there anyway to do this with an inbuilt function? I can't seem to find what I want with the declaration-identifiers on the Hyperspec.

Also, I'm using SBCL, if that makes a difference.

like image 440
Soyuz Avatar asked Feb 20 '23 20:02

Soyuz


1 Answers

Common Lisp does not provide static type checks for argument types. Some Common Lisp compilers do it as an extension, most notably CMUCL and SBCL. These static type checks use the typical declarations of variable types provided by DECLARE. You need to see the syntax of the various types to see what can be declared.

Dynamic checks at runtime are best done with CHECK-TYPE and ASSERT.

In this case I may like to specify that the input value "n" must be smaller than "m"

This is something like:

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

The list (m n) at the end is a list of variables which can be interactively set by the user, if the assert is violated. After entering a different value, the assertion will be checked again, until the assertion is satisfied.

like image 184
Rainer Joswig Avatar answered Mar 15 '23 20:03

Rainer Joswig