/
int.na
119 lines (91 loc) · 2.32 KB
/
int.na
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
inline C <<end
#include <string.h>
#include "prim.h"
#define MAX_LX_INT (0x3fffffff)
#define MIN_LX_INT (-0x40000000)
#define bigint(x) (prfmt(1, "%u\n", (x)), die1("no bigints yet", nil))
end
def int: sobj:
inline C (cmp b) <<end
register long a, b;
a = datum2int(rcv);
b = datum2int(n_b);
return (a < b) ? int2datum(-1) : (a > b) ? int2datum(1) : int2datum(0);
end
(== x) (is? (self.cmp x) 0)
(> x) (is? (self.cmp x) 1)
(< x) (is? (self.cmp x) -1)
(>= x) (self.cmp x) > -1
inline C (+ b) <<end
register long a, b, r;
a = datum2int(rcv);
b = datum2int(n_b);
r = a + b;
if (r >= MAX_LX_INT || r <= MIN_LX_INT) return bigint(r);
return int2datum(r);
end
inline C (- b) <<end
register long a, b, r;
a = datum2int(rcv);
b = datum2int(n_b);
r = a - b;
if (r >= MAX_LX_INT || r <= MIN_LX_INT) return bigint(r);
return int2datum(r);
end
inline C (* b) <<end
register long a, b, r;
a = datum2int(rcv);
b = datum2int(n_b);
if (b == 0) die("int.* -- modulo by zero");
r = a * b;
if (b == 0 || (r / b) == a) {
if (r >= MAX_LX_INT || r <= MIN_LX_INT) return bigint(r);
return int2datum(r);
}
die("should convert to bigints and try again");
return nil;
end
inline C (/ b) <<end
register long a, b, r;
a = datum2int(rcv);
b = datum2int(n_b);
if (b == 0) die("int./ -- division by zero");
r = a / b;
if (r == MAX_LX_INT + 1) return bigint(r);
return int2datum(r);
end
inline C (% b) <<end
register long a, b, r;
a = datum2int(rcv);
b = datum2int(n_b);
if (b == 0) die("int.% -- modulo by zero");
r = a % b;
return int2datum(r);
end
(** x) (error "not implemented")
inline C (<< shamt) <<end
int x, shamt, mask;
x = datum2int(rcv);
shamt = datum2int(n_shamt);
if (shamt > 31) {
return die1("no bigints yet", nil);
}
mask = ~0 << (31 - shamt);
if (x > 0 && (x & mask)) {
return die1("no bigints yet", nil);
}
if (x < 0 && ~(x | ~mask)) {
return die1("no bigints yet", nil);
}
return int2datum(x << shamt);
end
(str.):
def upper (self / 10)
def lower (self % 10)
def table "0123456789"
if (self < 10):
table self
else:
(upper.str) / (table lower)
(frozen.) self
'()