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 character-type istype? -rot 2drop boolean-type
25 ; 1 make-fa-primitive char?
27 :noname ( args -- boolobj )
28 string-type istype? -rot 2drop boolean-type
29 ; 1 make-fa-primitive string?
31 :noname ( args -- boolobj )
32 pair-type istype? -rot 2drop boolean-type
33 ; 1 make-fa-primitive pair?
35 :noname ( args -- boolobj )
36 primitive-proc-type istype? if
39 compound-proc-type istype?
42 -rot 2drop boolean-type
43 ; 1 make-fa-primitive procedure?
47 \ ==== Type conversions ==== {{{
49 :noname ( args -- fixnum )
50 2dup 1 ensure-arg-count
51 car character-type ensure-arg-type
54 ; make-primitive char->integer
56 :noname ( args -- char )
57 2dup 1 ensure-arg-count
58 car fixnum-type ensure-arg-type
61 ; make-primitive integer->char
63 : fixnum-to-charlist ( fixnum -- charlist )
66 [char] 0 character-type nil cons
70 nil 2swap ( charlist fixnum )
75 2dup swap 10 mod swap ( charlist fixnum fixnummod )
76 2swap swap 10 / swap ( charlist fixnummod fixnumdiv )
77 -2rot ( fixnumdiv charlist fixnummod )
79 drop [char] 0 + character-type 2swap
80 cons ( fixnumdiv newcharlist )
88 :noname ( args -- string )
89 2dup 1 ensure-arg-count
90 car fixnum-type ensure-arg-type
94 fixnum-to-charlist ( fixnum charlist )
96 [char] - character-type 2swap cons
100 ; make-primitive number->string
102 :noname ( args -- symbol )
103 2dup 1 ensure-arg-count
104 car string-type ensure-arg-type
108 2dup car [char] - character-type objeq? if
112 2dup car [char] + character-type objeq? if
120 2dup nil objeq? false =
122 2dup car drop [char] 0 - -rot
123 2swap swap 10 * + -rot
132 ; make-primitive string->number
134 :noname ( args -- string )
135 2dup 1 ensure-arg-count
136 car symbol-type ensure-arg-type
141 ; make-primitive symbol->string
143 :noname ( args -- symbol )
144 2dup 1 ensure-arg-count
145 car string-type ensure-arg-type
150 ; make-primitive string->symbol
154 \ ==== Numeric types ==== {{{
158 :noname ( fixnum fixnum -- boolobj )
160 ; 2 make-fa-primitive fix:=
162 :noname ( fixnum fixnum -- boolobj )
163 drop swap drop < boolean-type
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 -- boolobj )
180 ; 1 make-fa-primitive fix:zero?
182 :noname ( fixnum -- boolobj )
184 ; 1 make-fa-primitive fix:positive?
186 :noname ( fixnum -- boolobj )
188 ; 1 make-fa-primitive fix:negative?
190 :noname ( fixnum fixnum -- fixnum' )
191 drop swap drop + fixnum-type
192 ; 2 make-fa-primitive fix:+
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:quotient
206 :noname ( fixnum fixnum -- fixnum' )
207 drop swap drop mod fixnum-type
208 ; 2 make-fa-primitive fix:remainder
210 :noname ( fixnum -- fixnum+1 )
212 ; 1 make-fa-primitive fix:1+
214 :noname ( fixnum -- fixnum-1 )
216 ; 1 make-fa-primitive fix:-1+
218 :noname ( fixnum -- -fixnum )
220 ; 1 make-fa-primitive fix:neg
222 :noname ( fixnum -- -fixnum )
224 ; 1 make-fa-primitive fix:abs
232 ( Find the GCD of n1 and n2 where n2 < n1. )
243 :noname ( fixnum fixnum -- fixnum' )
244 drop swap drop gcd fixnum-type
245 ; 2 make-fa-primitive fix:gcd
249 :noname ( flonum flonum -- bool )
251 ; 2 make-fa-primitive flo:=
253 :noname ( flonum flonum -- bool )
254 drop swap drop f< boolean-type
255 ; 2 make-fa-primitive flo:<
257 :noname ( flonum flonum -- bool )
258 drop swap drop f> boolean-type
259 ; 2 make-fa-primitive flo:>
262 :noname ( flonum -- bool )
263 drop 0.0 = boolean-type
264 ; 1 make-fa-primitive flo:zero?
266 :noname ( flonum -- bool )
267 drop 0.0 f> boolean-type
268 ; 1 make-fa-primitive flo:positive?
270 :noname ( flonum -- bool )
271 drop 0.0 f< boolean-type
272 ; 1 make-fa-primitive flo:negative?
275 :noname ( flonum1 flonum2 -- flonum1+flonum2 )
276 drop swap drop f+ flonum-type
277 ; 2 make-fa-primitive flo:+
279 :noname ( flonum1 flonum2 -- flonum1-flonum2 )
280 drop swap drop f- flonum-type
281 ; 2 make-fa-primitive flo:-
283 :noname ( flonum1 flonum2 -- flonum1*flonum2 )
284 drop swap drop f* flonum-type
285 ; 2 make-fa-primitive flo:*
287 :noname ( flonum1 flonum2 -- flonum1/flonum2 )
288 drop swap drop f/ flonum-type
289 ; 2 make-fa-primitive flo:/
291 :noname ( flonum1 flonum2 -- flonum1/flonum2 )
292 drop swap drop f/ flonum-type
293 ; 2 make-fa-primitive flo:/
296 :noname ( flonum -- bool )
298 fnan? swap finf? or invert
299 ; 1 make-fa-primitive flo:finite?
302 :noname ( flonum -- flonum )
304 ; 1 make-fa-primitive flo:neg
306 :noname ( flonum -- flonum )
308 ; 1 make-fa-primitive flo:abs
310 :noname ( flonum -- flonum )
312 ; 1 make-fa-primitive flo:exp
314 :noname ( flonum -- flonum )
316 ; 1 make-fa-primitive flo:log
318 :noname ( flonum -- flonum )
320 ; 1 make-fa-primitive flo:sin
322 :noname ( flonum -- flonum )
324 ; 1 make-fa-primitive flo:cos
326 :noname ( flonum -- flonum )
328 ; 1 make-fa-primitive flo:tan
330 :noname ( flonum -- flonum )
332 ; 1 make-fa-primitive flo:asin
334 :noname ( flonum -- flonum )
336 ; 1 make-fa-primitive flo:acos
338 :noname ( flonum -- flonum )
340 ; 1 make-fa-primitive flo:atan
342 :noname ( flonum -- flonum )
344 ; 1 make-fa-primitive flo:sqrt
346 :noname ( flonum flonum -- flonum )
347 drop swap drop f^ flonum-type
348 ; 2 make-fa-primitive flo:expt
350 :noname ( flonum -- flonum )
352 ; 1 make-fa-primitive flo:floor
354 :noname ( flonum -- flonum )
356 ; 1 make-fa-primitive flo:ceiling
358 :noname ( flonum -- flonum )
360 ; 1 make-fa-primitive flo:truncate
362 :noname ( flonum -- flonum )
364 ; 1 make-fa-primitive flo:round
366 :noname ( flonum -- flonum )
367 drop floor f->i fixnum-type
368 ; 1 make-fa-primitive flo:floor->exact
370 :noname ( flonum -- flonum )
371 drop ceiling f->i fixnum-type
372 ; 1 make-fa-primitive flo:ceiling->exact
374 :noname ( flonum -- flonum )
375 drop truncate f->i fixnum-type
376 ; 1 make-fa-primitive flo:truncate->exact
378 :noname ( flonum -- flonum )
379 drop f->i fixnum-type
380 ; 1 make-fa-primitive flo:round->exact
382 :noname ( flonum flonum -- flonum )
383 drop swap drop f/ fatan flonum-type
384 ; 2 make-fa-primitive flo:atan2
389 :noname ( fixnum -- flonum )
390 drop i->f flonum-type
391 ; 1 make-fa-primitive fixnum->flonum
395 \ ==== Pairs and Lists ==== {{{
397 :noname ( arg1 arg2 -- pair )
399 ; 2 make-fa-primitive cons
401 :noname ( pair-obj -- obj )
403 ; pair-type 1 make-fa-type-primitive car
405 :noname ( args -- obj )
407 ; pair-type 1 make-fa-type-primitive cdr
409 :noname ( pair obj -- ok )
410 2swap pair-type ensure-arg-type
415 ; 2 make-fa-primitive set-car!
417 :noname ( pair obj -- ok )
418 2swap pair-type ensure-arg-type
423 ; 2 make-fa-primitive set-cdr!
427 \ ==== Polymorphic equality testing ==== {{{
429 :noname ( arg1 arg2 -- bool )
431 ; 2 make-fa-primitive eq?
435 \ ==== Input/Output ==== {{{
437 :noname ( args -- finalResult )
441 ; string-type 1 make-fa-type-primitive load
443 :noname ( args -- obj )
445 ; 0 make-fa-primitive read
449 :noname ( obj -- none )
451 ; 1 make-fa-primitive write
453 : displaypair ( pairobj -- )
457 nil? if 2drop exit then
458 pair-type istype? if space recurse exit then
462 : displaychar ( charobj -- )
465 : (displaystring) ( charlist -- )
474 : displaystring ( stringobj -- )
475 drop pair-type (displaystring)
479 pair-type istype? if ." (" displaypair ." )" exit then
480 character-type istype? if displaychar exit then
481 string-type istype? if displaystring exit then
486 :noname ( stringobj -- none )
488 ; string-type 1 make-fa-type-primitive display-string
490 :noname ( charobj -- none )
492 ; character-type 1 make-fa-type-primitive display-character
494 :noname ( obj -- none )
496 ; 1 make-fa-primitive display
498 :noname ( args -- none )
500 ; 0 make-fa-primitive newline
504 \ ==== Evaluation ==== {{{
506 :noname ( args -- result )
509 nil? false = if car then ( proc argvals )
512 ; make-primitive apply
516 \ ==== Miscellaneous ==== {{{
518 ( Produce a recoverable exception. )
519 :noname ( args -- result )
525 ." Error: " car display
530 recoverable-exception throw
531 ; make-primitive error
533 ( Generate a temporary unique symbol. Used in the creation of hygienic macros. )
534 :noname ( args -- result )
535 [char] _ character-type nil cons
537 ; 0 make-fa-primitive gensym
539 ( Generate the NONE object indicating an unspecified return value. )
540 :noname ( args -- result )
542 ; 0 make-fa-primitive none