|
|
1.1 root 1: (* Copyright 1989 by AT&T Bell Laboratories *)
2: abstraction Bigint : BIGINT = struct
3:
4: type bigint = bool list
5:
6: fun bigint 0 = nil
7: | bigint i = let val x = i div 2
8: in (x+x<i)::bigint x
9: end
10:
11: fun adwc(false::ar, false::br, carry) = carry::adwc(ar,br,false)
12: | adwc(a::ar, false::br, false) = a::adwc(ar,br,false)
13: | adwc(false::ar, b::br, false) = b::adwc(ar,br,false)
14: | adwc(true::ar, true::br, carry) = carry::adwc(ar,br,true)
15: | adwc(a::ar, true::br, true) = a::adwc(ar,br,true)
16: | adwc(true::ar, b::br, true) = b::adwc(ar,br,true)
17: | adwc(nil, false::br, carry) = carry::adwc(nil,br,false)
18: | adwc(nil, b::br, false) = b::adwc(nil,br,false)
19: | adwc(nil, true::br, true) = false::adwc(nil,br,true)
20: | adwc(nil, nil, false) = nil
21: | adwc(nil, nil, true) = [true]
22: | adwc(a, nil, carry) = adwc(nil, a, carry)
23:
24: fun a + b = adwc(a,b,false)
25:
26: fun a * nil = nil
27: | (false::a) * b = a * (false::b)
28: | (true::a) * b = b + a * (false::b)
29: | nil * b = nil
30:
31: fun getbit(a::r, 0) = a
32: | getbit(_::r, i) = getbit(r,i-1)
33: | getbit(nil, i) = false
34:
35: fun >>(a,0) = a
36: | >>(a::r,i) = >>(r,i-1)
37: | >>(nil,i) = nil
38:
39: fun size x = length x
40:
41: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.