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
156 :noname ( charlist -- string )
157 2dup 1 ensure-arg-count
166 pair-type ensure-arg-type
170 ; make-primitive list->string
172 :noname ( string -- charlist )
173 2dup 1 ensure-arg-count
174 car string-type ensure-arg-type
185 ; make-primitive string->list
189 \ ==== Numeric types ==== {{{
193 :noname ( fixnum fixnum -- boolobj )
195 ; 2 make-fa-primitive fix:=
197 :noname ( fixnum fixnum -- boolobj )
198 drop swap drop < boolean-type
199 ; 2 make-fa-primitive fix:<
201 :noname ( fixnum fixnum -- boolobj )
202 drop swap drop > boolean-type
203 ; 2 make-fa-primitive fix:>
205 :noname ( fixnum fixnum -- boolobj )
206 drop swap drop <= boolean-type
207 ; 2 make-fa-primitive fix:<=
209 :noname ( fixnum fixnum -- boolobj )
210 drop swap drop >= boolean-type
211 ; 2 make-fa-primitive fix:>=
213 :noname ( fixnum -- boolobj )
215 ; 1 make-fa-primitive fix:zero?
217 :noname ( fixnum -- boolobj )
219 ; 1 make-fa-primitive fix:positive?
221 :noname ( fixnum -- boolobj )
223 ; 1 make-fa-primitive fix:negative?
225 :noname ( fixnum fixnum -- fixnum' )
226 drop swap drop + fixnum-type
227 ; 2 make-fa-primitive fix:+
229 :noname ( fixnum fixnum -- fixnum' )
230 drop swap drop - fixnum-type
231 ; 2 make-fa-primitive fix:-
233 :noname ( fixnum fixnum -- fixnum' )
234 drop swap drop * fixnum-type
235 ; 2 make-fa-primitive fix:*
237 :noname ( fixnum fixnum -- fixnum' )
238 drop swap drop / fixnum-type
239 ; 2 make-fa-primitive fix:quotient
241 :noname ( fixnum fixnum -- fixnum' )
242 drop swap drop mod fixnum-type
243 ; 2 make-fa-primitive fix:remainder
245 :noname ( fixnum -- fixnum+1 )
247 ; 1 make-fa-primitive fix:1+
249 :noname ( fixnum -- fixnum-1 )
251 ; 1 make-fa-primitive fix:-1+
253 :noname ( fixnum -- -fixnum )
255 ; 1 make-fa-primitive fix:neg
257 :noname ( fixnum -- -fixnum )
259 ; 1 make-fa-primitive fix:abs
261 :noname ( fixnum fixnum -- fixnum' )
262 drop swap drop gcd fixnum-type
263 ; 2 make-fa-primitive fix:gcd
267 :noname ( flonum flonum -- bool )
269 ; 2 make-fa-primitive flo:=
271 :noname ( flonum flonum -- bool )
272 drop swap drop f< boolean-type
273 ; 2 make-fa-primitive flo:<
275 :noname ( flonum flonum -- bool )
276 drop swap drop f> boolean-type
277 ; 2 make-fa-primitive flo:>
280 :noname ( flonum -- bool )
281 drop 0.0 = boolean-type
282 ; 1 make-fa-primitive flo:zero?
284 :noname ( flonum -- bool )
285 drop 0.0 f> boolean-type
286 ; 1 make-fa-primitive flo:positive?
288 :noname ( flonum -- bool )
289 drop 0.0 f< boolean-type
290 ; 1 make-fa-primitive flo:negative?
293 :noname ( flonum1 flonum2 -- flonum1+flonum2 )
294 drop swap drop f+ flonum-type
295 ; 2 make-fa-primitive flo:+
297 :noname ( flonum1 flonum2 -- flonum1-flonum2 )
298 drop swap drop f- flonum-type
299 ; 2 make-fa-primitive flo:-
301 :noname ( flonum1 flonum2 -- flonum1*flonum2 )
302 drop swap drop f* flonum-type
303 ; 2 make-fa-primitive flo:*
305 :noname ( flonum1 flonum2 -- flonum1/flonum2 )
306 drop swap drop f/ flonum-type
307 ; 2 make-fa-primitive flo:/
309 :noname ( flonum1 flonum2 -- flonum1/flonum2 )
310 drop swap drop f/ flonum-type
311 ; 2 make-fa-primitive flo:/
314 :noname ( flonum -- bool )
316 fnan? swap finf? or invert
317 ; 1 make-fa-primitive flo:finite?
320 :noname ( flonum -- flonum )
322 ; 1 make-fa-primitive flo:neg
324 :noname ( flonum -- flonum )
326 ; 1 make-fa-primitive flo:abs
328 :noname ( flonum -- flonum )
330 ; 1 make-fa-primitive flo:exp
332 :noname ( flonum -- flonum )
334 ; 1 make-fa-primitive flo:log
336 :noname ( flonum -- flonum )
338 ; 1 make-fa-primitive flo:sin
340 :noname ( flonum -- flonum )
342 ; 1 make-fa-primitive flo:cos
344 :noname ( flonum -- flonum )
346 ; 1 make-fa-primitive flo:tan
348 :noname ( flonum -- flonum )
350 ; 1 make-fa-primitive flo:asin
352 :noname ( flonum -- flonum )
354 ; 1 make-fa-primitive flo:acos
356 :noname ( flonum -- flonum )
358 ; 1 make-fa-primitive flo:atan
360 :noname ( flonum -- flonum )
362 ; 1 make-fa-primitive flo:sqrt
364 :noname ( flonum flonum -- flonum )
365 drop swap drop f^ flonum-type
366 ; 2 make-fa-primitive flo:expt
368 :noname ( flonum -- flonum )
370 ; 1 make-fa-primitive flo:floor
372 :noname ( flonum -- flonum )
374 ; 1 make-fa-primitive flo:ceiling
376 :noname ( flonum -- flonum )
378 ; 1 make-fa-primitive flo:truncate
380 :noname ( flonum -- flonum )
382 ; 1 make-fa-primitive flo:round
384 :noname ( flonum -- flonum )
385 drop floor f->i fixnum-type
386 ; 1 make-fa-primitive flo:floor->exact
388 :noname ( flonum -- flonum )
389 drop ceiling f->i fixnum-type
390 ; 1 make-fa-primitive flo:ceiling->exact
392 :noname ( flonum -- flonum )
393 drop truncate f->i fixnum-type
394 ; 1 make-fa-primitive flo:truncate->exact
396 :noname ( flonum -- flonum )
397 drop f->i fixnum-type
398 ; 1 make-fa-primitive flo:round->exact
400 :noname ( flonum flonum -- flonum )
401 drop swap drop f/ fatan flonum-type
402 ; 2 make-fa-primitive flo:atan2
406 ' make-rational 2 make-fa-primitive make-rational
408 :noname ( ratnum -- fixnum )
410 ; 1 make-fa-primitive rat:numerator
412 :noname ( ratnum -- fixnum )
414 ; 1 make-fa-primitive rat:denominator
418 :noname ( fixnum -- flonum )
419 drop i->f flonum-type
420 ; 1 make-fa-primitive fixnum->flonum
424 \ ==== Pairs and Lists ==== {{{
426 :noname ( arg1 arg2 -- pair )
428 ; 2 make-fa-primitive cons
430 :noname ( pair-obj -- obj )
432 ; pair-type 1 make-fa-type-primitive car
434 :noname ( args -- obj )
436 ; pair-type 1 make-fa-type-primitive cdr
438 :noname ( pair obj -- ok )
439 2swap pair-type ensure-arg-type
444 ; 2 make-fa-primitive set-car!
446 :noname ( pair obj -- ok )
447 2swap pair-type ensure-arg-type
452 ; 2 make-fa-primitive set-cdr!
456 \ ==== Polymorphic equality testing ==== {{{
458 :noname ( arg1 arg2 -- bool )
460 ; 2 make-fa-primitive eq?
464 \ ==== Input/Output ==== {{{
467 console-i/o-port obj@
468 ; 0 make-fa-primitive console-i/o-port
471 current-input-port obj@
472 ; 0 make-fa-primitive current-input-port
474 : charlist>cstr ( charlist addr -- n )
476 dup 2swap ( origaddr addr charlist )
482 drop ( origaddr addr charlist char )
483 -rot 2swap ( origaddr charlist addr char )
485 1+ -rot ( origaddr nextaddr charlist )
488 2drop ( origaddr finaladdr )
492 :noname ( args -- finalResult )
496 ; string-type 1 make-fa-type-primitive load
498 :noname ( args -- obj )
500 ; 0 make-fa-primitive read
504 :noname ( obj -- none )
506 ; 1 make-fa-primitive write
508 : displaypair ( pairobj -- )
512 nil? if 2drop exit then
513 pair-type istype? if space recurse exit then
517 : displaychar ( charobj -- )
520 : (displaystring) ( charlist -- )
529 : displaystring ( stringobj -- )
530 drop pair-type (displaystring)
534 pair-type istype? if ." (" displaypair ." )" exit then
535 character-type istype? if displaychar exit then
536 string-type istype? if displaystring exit then
541 :noname ( stringobj -- none )
543 ; string-type 1 make-fa-type-primitive display-string
545 :noname ( charobj -- none )
547 ; character-type 1 make-fa-type-primitive display-character
549 :noname ( obj -- none )
551 ; 1 make-fa-primitive display
553 :noname ( args -- none )
555 ; 0 make-fa-primitive newline
559 \ ==== Evaluation ==== {{{
561 :noname ( args -- result )
564 nil? false = if car then ( proc argvals )
567 ; make-primitive apply
571 \ ==== Miscellaneous ==== {{{
573 ( Produce a recoverable exception. )
574 :noname ( args -- result )
580 ." Error: " car display
585 recoverable-exception throw
586 ; make-primitive error
588 ( Generate a temporary unique symbol. Used in the creation of hygienic macros. )
589 :noname ( args -- result )
590 [char] _ character-type nil cons
592 ; 0 make-fa-primitive gensym
594 ( Generate the NONE object indicating an unspecified return value. )
595 :noname ( args -- result )
597 ; 0 make-fa-primitive none