|
SketchyLISP Reference |
Copyright (C) 2007 Nils M Holm |
| <<[n*] | [Index] | [n-]>> |
Conformance: SketchyLISP Core
Purpose: Add two natural numbers.
Arguments:
A - natural number
B - natural number
Model:
(define (n+ a b)
(letrec
; Compute the sum of two digits and a carry flag.
; X Y - digits
; CI CO - carry in, out
; RESULT - (sum . carry out)
((d+
(lambda (x y ci co)
(cond ((eq? x 0d)
(cond ((eq? ci 1d)
; add carry flag
(d+ 1d y 0d co))
(else (cons y co))))
; handle overflow
((null? (succ y))
(d+ (pred x) 0d ci 1d))
(else (d+ (pred x) (succ y) ci co)))))
; Add lists of digit
; A,B - lists
; C - carry
; R - result
(add
(lambda (a b c r)
(cond ((null? a)
(cond
; A=() ; B=()
((null? b)
(cond
; carry not set? return R
((eq? c 0d) r)
; else prepend overflow
(else (cons 1d r))))
; B\=(): keep adding leading zeroes
(else (add '() (cdr b)
(cdr (d+ 0d (car b) c 0d))
(cons (car (d+ 0d (car b) c 0d))
r)))))
((null? b)
; B=() ; A\=()
(add (cdr a) '()
(cdr (d+ (car a) 0d c 0d))
(cons (car (d+ (car a) 0d c 0d))
r)))
; default: advance to next two digits
(else (add (cdr a) (cdr b)
(cdr (d+ (car a) (car b) c 0d))
(cons (car (d+ (car a) (car b) c 0d))
r)))))))
(list->integer
(add (reverse (integer->list a))
(reverse (integer->list b))
0d '())
#t)))
Implementation:
; This function is a primitive function.
Example:
(n+ 5 7) => 12
See also:
digits,
n-,
nquotient,
nremainder,
n*,
+.
| <<[n*] | [Index] | [n-]>> |