t3x.org / sketchy / library / divide.html
SketchyLISP
Reference
  Copyright (C) 2006
Nils M Holm

divide

Conformance: SketchyLISP Core

Purpose: Divide two numbers, giving a result of the form
(quotient remainder).

Arguments:
A - number (dividend)
B - number (divisor)

Implementation:

(define (divide a b)
  (letrec

    ((sign (lambda (x)
      (cond ((eq? (negative? a) (negative? b)) x)
        (#t (list->integer
              (cons '- (integer->list x)) #t)))))

    (rsign (lambda (x)
      (cond ((negative? a)
          (list->integer
            (cons '- (integer->list x)) #t))
        (#t x))))

    (idiv (lambda (a b)
      (cond ((zero? b) (bottom 'divide-by-zero))
        ; overflow?
        ((n< (abs a) (abs b))
          (list 0 (rsign (abs a))))
        ; compute quotient, remainder
        (#t (let ((q (ndivide (abs a) (abs b))))
              (list (sign (car q))
                    (rsign (cadr q)))))))))

    (idiv (integer a) (integer b))))

Example:

(divide 11 -2) 
=> (-5 1)

See also:
digits, quotient, remainder, modulo, +, -, *, ndivide.