1 \ ==== Type predilcates ==== {{{
3 :noname ( args -- boolobj )
4 nil objeq? boolean-type
5 ; 1 make-fa-primitive null?
7 :noname ( args -- boolobj )
8 boolean-type istype? -rot 2drop boolean-type
9 ; 1 make-fa-primitive boolean?
11 :noname ( args -- boolobj )
12 symbol-type istype? -rot 2drop boolean-type
13 ; 1 make-fa-primitive symbol?
15 :noname ( args -- boolobj )
16 fixnum-type istype? -rot 2drop boolean-type
17 ; 1 make-fa-primitive fixnum?
19 :noname ( args -- boolobj )
20 flonum-type istype? -rot 2drop boolean-type
21 ; 1 make-fa-primitive flonum?
23 :noname ( args -- boolobj )
24 ratnum-type istype? -rot 2drop boolean-type
25 ; 1 make-fa-primitive ratnum?
27 :noname ( args -- boolobj )
28 character-type istype? -rot 2drop boolean-type
29 ; 1 make-fa-primitive char?
31 :noname ( args -- boolobj )
32 string-type istype? -rot 2drop boolean-type
33 ; 1 make-fa-primitive string?
35 :noname ( args -- boolobj )
36 pair-type istype? -rot 2drop boolean-type
37 ; 1 make-fa-primitive pair?
39 :noname ( args -- boolobj )
40 primitive-proc-type istype? if
43 compound-proc-type istype?
46 -rot 2drop boolean-type
47 ; 1 make-fa-primitive procedure?
51 \ ==== Type conversions ==== {{{
53 :noname ( args -- fixnum )
54 2dup 1 ensure-arg-count
55 car character-type ensure-arg-type
58 ; make-primitive char->integer
60 :noname ( args -- char )
61 2dup 1 ensure-arg-count
62 car fixnum-type ensure-arg-type
65 ; make-primitive integer->char
67 : fixnum-to-charlist ( fixnum -- charlist )
70 [char] 0 character-type nil cons
74 nil 2swap ( charlist fixnum )
79 2dup swap 10 mod swap ( charlist fixnum fixnummod )
80 2swap swap 10 / swap ( charlist fixnummod fixnumdiv )
81 -2rot ( fixnumdiv charlist fixnummod )
83 drop [char] 0 + character-type 2swap
84 cons ( fixnumdiv newcharlist )
92 :noname ( args -- string )
93 2dup 1 ensure-arg-count
94 car fixnum-type ensure-arg-type
98 fixnum-to-charlist ( fixnum charlist )
100 [char] - character-type 2swap cons
104 ; make-primitive number->string
106 :noname ( args -- symbol )
107 2dup 1 ensure-arg-count
108 car string-type ensure-arg-type
112 2dup car [char] - character-type objeq? if
116 2dup car [char] + character-type objeq? if
124 2dup nil objeq? false =
126 2dup car drop [char] 0 - -rot
127 2swap swap 10 * + -rot
136 ; make-primitive string->number
138 :noname ( args -- string )
139 2dup 1 ensure-arg-count
140 car symbol-type ensure-arg-type
145 ; make-primitive symbol->string
147 :noname ( args -- symbol )
148 2dup 1 ensure-arg-count
149 car string-type ensure-arg-type
154 ; make-primitive string->symbol
158 \ ==== Numeric types ==== {{{
162 :noname ( fixnum fixnum -- boolobj )
164 ; 2 make-fa-primitive fix:=
166 :noname ( fixnum fixnum -- boolobj )
167 drop swap drop < boolean-type
168 ; 2 make-fa-primitive fix:<
170 :noname ( fixnum fixnum -- boolobj )
171 drop swap drop > boolean-type
172 ; 2 make-fa-primitive fix:>
174 :noname ( fixnum fixnum -- boolobj )
175 drop swap drop <= boolean-type
176 ; 2 make-fa-primitive fix:<=
178 :noname ( fixnum fixnum -- boolobj )
179 drop swap drop >= boolean-type
180 ; 2 make-fa-primitive fix:>=
182 :noname ( fixnum -- boolobj )
184 ; 1 make-fa-primitive fix:zero?
186 :noname ( fixnum -- boolobj )
188 ; 1 make-fa-primitive fix:positive?
190 :noname ( fixnum -- boolobj )
192 ; 1 make-fa-primitive fix:negative?
194 :noname ( fixnum fixnum -- fixnum' )
195 drop swap drop + fixnum-type
196 ; 2 make-fa-primitive fix:+
198 :noname ( fixnum fixnum -- fixnum' )
199 drop swap drop - fixnum-type
200 ; 2 make-fa-primitive fix:-
202 :noname ( fixnum fixnum -- fixnum' )
203 drop swap drop * fixnum-type
204 ; 2 make-fa-primitive fix:*
206 :noname ( fixnum fixnum -- fixnum' )
207 drop swap drop / fixnum-type
208 ; 2 make-fa-primitive fix:quotient
210 :noname ( fixnum fixnum -- fixnum' )
211 drop swap drop mod fixnum-type
212 ; 2 make-fa-primitive fix:remainder
214 :noname ( fixnum -- fixnum+1 )
216 ; 1 make-fa-primitive fix:1+
218 :noname ( fixnum -- fixnum-1 )
220 ; 1 make-fa-primitive fix:-1+
222 :noname ( fixnum -- -fixnum )
224 ; 1 make-fa-primitive fix:neg
226 :noname ( fixnum -- -fixnum )
228 ; 1 make-fa-primitive fix:abs
230 :noname ( fixnum fixnum -- fixnum' )
231 drop swap drop gcd fixnum-type
232 ; 2 make-fa-primitive fix:gcd
236 :noname ( flonum flonum -- bool )
238 ; 2 make-fa-primitive flo:=
240 :noname ( flonum flonum -- bool )
241 drop swap drop f< boolean-type
242 ; 2 make-fa-primitive flo:<
244 :noname ( flonum flonum -- bool )
245 drop swap drop f> boolean-type
246 ; 2 make-fa-primitive flo:>
249 :noname ( flonum -- bool )
250 drop 0.0 = boolean-type
251 ; 1 make-fa-primitive flo:zero?
253 :noname ( flonum -- bool )
254 drop 0.0 f> boolean-type
255 ; 1 make-fa-primitive flo:positive?
257 :noname ( flonum -- bool )
258 drop 0.0 f< boolean-type
259 ; 1 make-fa-primitive flo:negative?
262 :noname ( flonum1 flonum2 -- flonum1+flonum2 )
263 drop swap drop f+ flonum-type
264 ; 2 make-fa-primitive flo:+
266 :noname ( flonum1 flonum2 -- flonum1-flonum2 )
267 drop swap drop f- flonum-type
268 ; 2 make-fa-primitive flo:-
270 :noname ( flonum1 flonum2 -- flonum1*flonum2 )
271 drop swap drop f* flonum-type
272 ; 2 make-fa-primitive flo:*
274 :noname ( flonum1 flonum2 -- flonum1/flonum2 )
275 drop swap drop f/ flonum-type
276 ; 2 make-fa-primitive flo:/
278 :noname ( flonum1 flonum2 -- flonum1/flonum2 )
279 drop swap drop f/ flonum-type
280 ; 2 make-fa-primitive flo:/
283 :noname ( flonum -- bool )
285 fnan? swap finf? or invert
286 ; 1 make-fa-primitive flo:finite?
289 :noname ( flonum -- flonum )
291 ; 1 make-fa-primitive flo:neg
293 :noname ( flonum -- flonum )
295 ; 1 make-fa-primitive flo:abs
297 :noname ( flonum -- flonum )
299 ; 1 make-fa-primitive flo:exp
301 :noname ( flonum -- flonum )
303 ; 1 make-fa-primitive flo:log
305 :noname ( flonum -- flonum )
307 ; 1 make-fa-primitive flo:sin
309 :noname ( flonum -- flonum )
311 ; 1 make-fa-primitive flo:cos
313 :noname ( flonum -- flonum )
315 ; 1 make-fa-primitive flo:tan
317 :noname ( flonum -- flonum )
319 ; 1 make-fa-primitive flo:asin
321 :noname ( flonum -- flonum )
323 ; 1 make-fa-primitive flo:acos
325 :noname ( flonum -- flonum )
327 ; 1 make-fa-primitive flo:atan
329 :noname ( flonum -- flonum )
331 ; 1 make-fa-primitive flo:sqrt
333 :noname ( flonum flonum -- flonum )
334 drop swap drop f^ flonum-type
335 ; 2 make-fa-primitive flo:expt
337 :noname ( flonum -- flonum )
339 ; 1 make-fa-primitive flo:floor
341 :noname ( flonum -- flonum )
343 ; 1 make-fa-primitive flo:ceiling
345 :noname ( flonum -- flonum )
347 ; 1 make-fa-primitive flo:truncate
349 :noname ( flonum -- flonum )
351 ; 1 make-fa-primitive flo:round
353 :noname ( flonum -- flonum )
354 drop floor f->i fixnum-type
355 ; 1 make-fa-primitive flo:floor->exact
357 :noname ( flonum -- flonum )
358 drop ceiling f->i fixnum-type
359 ; 1 make-fa-primitive flo:ceiling->exact
361 :noname ( flonum -- flonum )
362 drop truncate f->i fixnum-type
363 ; 1 make-fa-primitive flo:truncate->exact
365 :noname ( flonum -- flonum )
366 drop f->i fixnum-type
367 ; 1 make-fa-primitive flo:round->exact
369 :noname ( flonum flonum -- flonum )
370 drop swap drop f/ fatan flonum-type
371 ; 2 make-fa-primitive flo:atan2
375 ' make-rational 2 make-fa-primitive make-rational
377 :noname ( ratnum -- fixnum )
379 ; 1 make-fa-primitive rat:numerator
381 :noname ( ratnum -- fixnum )
383 ; 1 make-fa-primitive rat:denominator
387 :noname ( fixnum -- flonum )
388 drop i->f flonum-type
389 ; 1 make-fa-primitive fixnum->flonum
393 \ ==== Pairs and Lists ==== {{{
395 :noname ( arg1 arg2 -- pair )
397 ; 2 make-fa-primitive cons
399 :noname ( pair-obj -- obj )
401 ; pair-type 1 make-fa-type-primitive car
403 :noname ( args -- obj )
405 ; pair-type 1 make-fa-type-primitive cdr
407 :noname ( pair obj -- ok )
408 2swap pair-type ensure-arg-type
413 ; 2 make-fa-primitive set-car!
415 :noname ( pair obj -- ok )
416 2swap pair-type ensure-arg-type
421 ; 2 make-fa-primitive set-cdr!
425 \ ==== Polymorphic equality testing ==== {{{
427 :noname ( arg1 arg2 -- bool )
429 ; 2 make-fa-primitive eq?
433 \ ==== Input/Output ==== {{{
435 :noname ( args -- finalResult )
439 ; string-type 1 make-fa-type-primitive load
441 :noname ( args -- obj )
443 ; 0 make-fa-primitive read
447 :noname ( obj -- none )
449 ; 1 make-fa-primitive write
451 : displaypair ( pairobj -- )
455 nil? if 2drop exit then
456 pair-type istype? if space recurse exit then
460 : displaychar ( charobj -- )
463 : (displaystring) ( charlist -- )
472 : displaystring ( stringobj -- )
473 drop pair-type (displaystring)
477 pair-type istype? if ." (" displaypair ." )" exit then
478 character-type istype? if displaychar exit then
479 string-type istype? if displaystring exit then
484 :noname ( stringobj -- none )
486 ; string-type 1 make-fa-type-primitive display-string
488 :noname ( charobj -- none )
490 ; character-type 1 make-fa-type-primitive display-character
492 :noname ( obj -- none )
494 ; 1 make-fa-primitive display
496 :noname ( args -- none )
498 ; 0 make-fa-primitive newline
502 \ ==== Evaluation ==== {{{
504 :noname ( args -- result )
507 nil? false = if car then ( proc argvals )
510 ; make-primitive apply
514 \ ==== Miscellaneous ==== {{{
516 ( Produce a recoverable exception. )
517 :noname ( args -- result )
523 ." Error: " car display
528 recoverable-exception throw
529 ; make-primitive error
531 ( Generate a temporary unique symbol. Used in the creation of hygienic macros. )
532 :noname ( args -- result )
533 [char] _ character-type nil cons
535 ; 0 make-fa-primitive gensym
537 ( Generate the NONE object indicating an unspecified return value. )
538 :noname ( args -- result )
540 ; 0 make-fa-primitive none