Implemented fixnum =.
[scheme.forth.jl.git] / scheme-primitives.4th
1 ( = Type predicates = )
2
3 :noname ( args -- boolobj )
4     2dup 1 ensure-arg-count
5
6     car nil objeq? boolean-type
7 ; make-primitive null?
8
9 :noname ( args -- boolobj )
10     2dup 1 ensure-arg-count
11
12     car boolean-type istype? -rot 2drop boolean-type
13 ; make-primitive boolean?
14
15 :noname ( args -- boolobj )
16     2dup 1 ensure-arg-count
17
18     car symbol-type istype? -rot 2drop boolean-type
19 ; make-primitive symbol?
20
21 :noname ( args -- boolobj )
22     2dup 1 ensure-arg-count
23
24     car fixnum-type istype? -rot 2drop boolean-type
25 ; make-primitive integer?
26
27 :noname ( args -- boolobj )
28     2dup 1 ensure-arg-count
29
30     car character-type istype? -rot 2drop boolean-type
31 ; make-primitive char?
32
33 :noname ( args -- boolobj )
34     2dup 1 ensure-arg-count
35
36     car string-type istype? -rot 2drop boolean-type
37 ; make-primitive string?
38
39 :noname ( args -- boolobj )
40     2dup 1 ensure-arg-count
41
42     car pair-type istype? -rot 2drop boolean-type
43 ; make-primitive pair?
44
45 :noname ( args -- boolobj )
46     2dup 1 ensure-arg-count
47
48     car primitive-type istype? -rot 2drop boolean-type
49 ; make-primitive procedure?
50
51 ( = Type conversions = )
52
53 :noname ( args -- fixnum )
54     2dup 1 ensure-arg-count
55     car character-type ensure-arg-type
56
57     drop fixnum-type
58 ; make-primitive char->integer
59
60 :noname ( args -- char )
61     2dup 1 ensure-arg-count
62     car fixnum-type ensure-arg-type
63
64     drop character-type
65 ; make-primitive integer->char
66
67 : num-to-charlist ( num -- charlist )
68     ?dup 0= if
69         [char] 0 character-type nil cons
70         exit
71     then
72
73     nil rot
74
75     begin
76         ?dup 0>
77     while
78         dup 10 mod swap 10 / swap
79         2swap rot
80         [char] 0 + character-type 2swap
81         cons
82         rot
83     repeat
84 ;
85
86 :noname ( args -- string )
87     2dup 1 ensure-arg-count
88     car fixnum-type ensure-arg-type
89
90     drop
91
92     dup 0< swap abs ( bool num )
93     num-to-charlist
94     rot if
95         [char] - character-type 2swap cons
96     then
97
98     drop string-type
99 ; make-primitive number->string
100
101 :noname ( args -- symbol )
102     2dup 1 ensure-arg-count
103     car string-type ensure-arg-type
104
105     drop pair-type
106
107     2dup car [char] - character-type objeq? if
108         cdr
109         true -rot
110     else
111         2dup car [char] + character-type objeq? if
112             cdr
113         then
114         false -rot
115     then
116
117     0 -rot
118     begin
119         2dup nil objeq? false =
120     while
121         2dup car drop [char] 0 - -rot
122         2swap swap 10 * + -rot
123         cdr
124     repeat
125
126     2drop
127
128     swap if -1 * then
129
130     fixnum-type
131 ; make-primitive string->number
132
133 :noname ( args -- string )
134     2dup 1 ensure-arg-count
135     car symbol-type ensure-arg-type
136
137     drop pair-type
138     duplicate-charlist
139     drop string-type
140 ; make-primitive symbol->string
141
142 :noname ( args -- symbol )
143     2dup 1 ensure-arg-count
144     car string-type ensure-arg-type
145
146     drop pair-type
147     duplicate-charlist
148     charlist>symbol
149 ; make-primitive string->symbol
150
151 ( = Arithmetic = )
152
153 : add-prim ( args -- fixnum )
154     2dup nil objeq? if
155         2drop
156         0 fixnum-type
157     else
158         2dup car drop
159         -rot cdr recurse drop
160         + fixnum-type
161     then
162 ;
163 ' add-prim make-primitive +
164
165 :noname ( args -- fixnum )
166     2dup nil objeq? if
167         2drop
168         0 fixnum-type
169     else
170         2dup car drop
171         -rot cdr
172         2dup nil objeq? if
173             2drop negate
174         else
175             add-prim drop
176             -
177         then
178         fixnum-type
179     then
180 ; make-primitive -
181
182 :noname ( args -- fixnum )
183     2dup nil objeq? if
184         2drop
185         1 fixnum-type
186     else
187         2dup car drop
188         -rot cdr recurse drop
189         * fixnum-type
190     then
191 ; make-primitive *
192
193 :noname ( args -- fixnum )
194     2dup 2 ensure-arg-count
195
196     2dup car fixnum-type ensure-arg-type
197     2swap cdr car fixnum-type ensure-arg-type
198
199     drop swap drop
200
201     / fixnum-type
202 ; make-primitive quotient
203
204 :noname ( args -- fixnum )
205     2dup 2 ensure-arg-count
206
207     2dup car fixnum-type ensure-arg-type
208     2swap cdr car fixnum-type ensure-arg-type
209
210     drop swap drop
211
212     mod fixnum-type
213 ; make-primitive remainder
214
215 :noname ( args -- bool )
216
217     2dup nil objeq? if
218         true boolean-type exit
219     then
220
221     ( args )
222
223     2dup car fixnum-type ensure-arg-type ( args arg0 )
224     2swap cdr ( arg0 args' )
225
226     2dup nil objeq? if
227         2drop 2drop
228         true boolean-type exit
229     then
230
231     ( arg0 args' )
232
233     begin
234         2dup nil objeq? false =
235     while
236         2dup car fixnum-type ensure-arg-type ( arg0 args' arg1 )
237         2rot 2dup 2rot ( args' arg0 arg0 arg1 )
238         objeq? false = if
239             2drop 2drop
240             false boolean-type exit
241         then
242
243         2swap cdr ( arg0 args'' )
244     repeat
245
246     2drop 2drop
247     true boolean-type
248 ; make-primitive =
249
250 ( = Pairs and Lists = )
251
252 :noname ( args -- pair )
253     2dup 2 ensure-arg-count
254
255     2dup car 2swap cdr car
256     cons
257 ; make-primitive cons
258
259 :noname ( args -- list )
260     \ args is already a list!
261 ; make-primitive list
262
263 :noname ( args -- pair )
264     2dup 1 ensure-arg-count
265     car pair-type ensure-arg-type
266
267     car
268 ; make-primitive car
269
270 :noname ( args -- pair )
271     2dup 1 ensure-arg-count
272     car pair-type ensure-arg-type
273
274     cdr
275 ; make-primitive cdr
276
277 :noname ( args -- pair )
278     2dup 2 ensure-arg-count
279     2dup cdr car
280     2swap car pair-type ensure-arg-type
281
282     set-car!
283
284     ok-symbol
285 ; make-primitive set-car!
286
287 :noname ( args -- pair )
288     2dup 2 ensure-arg-count
289     2dup cdr car
290     2swap car pair-type ensure-arg-type
291
292     set-cdr!
293
294     ok-symbol
295 ; make-primitive set-cdr!
296
297 ( = Polymorphic equality testing = )
298
299 :noname ( args -- bool )
300     2dup 2 ensure-arg-count
301     2dup cdr car
302     2swap car
303
304     objeq? boolean-type
305 ; make-primitive eq?