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

divide

Conformance: SketchyLISP Core

Purpose: Divide two numbers, giving a quotient and a remainder.

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

Implementation:

(define (divide a b)
  (letrec
    ((sign
       (lambda (x)
         (cond ((eq? (negative? a) (negative? b)) x)
           (else (list->integer
                 (cons '- (integer->list x)) #t)))))
     (rsign
       (lambda (x)
         (cond ((negative? a)
             (list->integer
               (cons '- (integer->list x)) #t))
           (else 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
           (else (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.