home *** CD-ROM | disk | FTP | other *** search
- ;; Verschiedene Funktionen für Integers
- ;; Bruno Haible 25.4.1989, 5.9.1990
-
- (provide 'intmisc)
-
- ; exakter Quotient von Integers, schneller als / :
- #-CLISP
- (defun exquo (a b)
- (multiple-value-bind (q r) (floor a b)
- (unless (zerop r) (error "Quotient ~S/~S nicht exakt." a b))
- q
- ) )
-
- ; Fakultät:
- #-CLISP
- (defun ! (n)
- (assert (and (integerp n) (>= n 0))
- (n)
- "Argument muß eine natürliche Zahl sein, nicht ~S" n
- )
- (do* ((p 1 (* p i))
- (i n (- i 1)))
- ((zerop i) p)
- ) )
-
- ; Installiert eine Funktionsdefinition einer auf N0 definierten Funktion
- ; (mit NIL nicht im Wertebereich) mit "Gedächtnis" unter name:
- (defmacro defun-N0 (name (var) &body body &environment env)
- (multiple-value-bind (body-rest declarations)
- (sys::parse-body body nil env)
- (if declarations
- (setq declarations (list (cons 'DECLARE (nreverse declarations))))
- )
- (let ((remember (gensym)))
- `(let ((,remember (make-array 0 :adjustable t :initial-element nil)))
- (defun ,name (,var)
- ,@declarations
- ; (assert (typep ,var '(integer 0 *))) ; Typtest
- (assert (and (integerp ,var) (>= ,var 0))) ; explizit
- (unless (< ,var (length ,remember))
- (setq ,remember (adjust-array ,remember (+ ,var 1 50)))
- )
- (or (aref ,remember ,var)
- (setf (aref ,remember ,var) (progn ,@body-rest))
- ) ) )
- ) ) )
-
-