-( = Type predicates = )
+\ ==== Type predicates ==== {{{
:noname ( args -- boolobj )
2dup 1 ensure-arg-count
:noname ( args -- boolobj )
2dup 1 ensure-arg-count
- car primitive-type istype? -rot 2drop boolean-type
+ car primitive-proc-type istype? -rot 2drop boolean-type
; make-primitive procedure?
-( = Type conversions = )
+\ }}}
+
+\ ==== Type conversions ==== {{{
:noname ( args -- fixnum )
2dup 1 ensure-arg-count
drop character-type
; make-primitive integer->char
-: num-to-charlist ( num -- charlist )
- ?dup 0= if
+: fixnum-to-charlist ( fixnum -- charlist )
+ over 0= if
+ 2drop
[char] 0 character-type nil cons
exit
then
- nil rot
+ nil 2swap ( charlist fixnum )
begin
- ?dup 0>
+ over 0>
while
- dup 10 mod swap 10 / swap
- 2swap rot
- [char] 0 + character-type 2swap
- cons
- rot
+ 2dup swap 10 mod swap ( charlist fixnum fixnummod )
+ 2swap swap 10 / swap ( charlist fixnummod fixnumdiv )
+ -2rot ( fixnumdiv charlist fixnummod )
+
+ drop [char] 0 + character-type 2swap
+ cons ( fixnumdiv newcharlist )
+
+ 2swap
repeat
+
+ 2drop
;
:noname ( args -- string )
2dup 1 ensure-arg-count
car fixnum-type ensure-arg-type
- drop
+ 2dup swap abs swap
- dup 0< swap abs ( bool num )
- num-to-charlist
- rot if
+ fixnum-to-charlist ( fixnum charlist )
+ 2swap drop 0< if
[char] - character-type 2swap cons
then
charlist>symbol
; make-primitive string->symbol
-( = Arithmetic = )
+\ }}}
+
+\ ==== Arithmetic ==== {{{
: add-prim ( args -- fixnum )
2dup nil objeq? if
mod fixnum-type
; make-primitive remainder
-:noname ( args -- bool )
+variable relcfa
+
+: test-relation ( args -- bool )
2dup nil objeq? if
+ 2drop
true boolean-type exit
then
2dup nil objeq? false =
while
2dup car fixnum-type ensure-arg-type ( arg0 args' arg1 )
- 2rot 2dup 2rot ( args' arg0 arg0 arg1 )
- objeq? false = if
+ 2rot 2swap 2dup 2rot 2swap ( args' arg1 arg1 arg0 )
+ relcfa @ execute false = if
2drop 2drop
false boolean-type exit
then
2drop 2drop
true boolean-type
+;
+
+: fixnum-lt ( obj1 obj2 -- bool )
+ drop swap drop <
+;
+
+:noname
+ ['] fixnum-lt relcfa !
+ test-relation
+; make-primitive <
+
+: fixnum-gt ( obj1 obj2 -- bool )
+ drop swap drop >
+;
+
+:noname
+ ['] fixnum-gt relcfa !
+ test-relation
+; make-primitive >
+
+: fixnum-eq ( obj1 obj2 -- bool )
+ drop swap drop =
+;
+
+:noname
+ ['] fixnum-eq relcfa !
+ test-relation
; make-primitive =
-( = Pairs and Lists = )
+hide relcfa
+
+\ }}}
+
+\ ==== Pairs and Lists ==== {{{
:noname ( args -- pair )
2dup 2 ensure-arg-count
\ args is already a list!
; make-primitive list
-:noname ( args -- pair )
+:noname ( args -- obj )
2dup 1 ensure-arg-count
car pair-type ensure-arg-type
car
; make-primitive car
-:noname ( args -- pair )
+:noname ( args -- obj )
2dup 1 ensure-arg-count
car pair-type ensure-arg-type
cdr
; make-primitive cdr
-:noname ( args -- pair )
+:noname ( args -- ok )
2dup 2 ensure-arg-count
2dup cdr car
2swap car pair-type ensure-arg-type
ok-symbol
; make-primitive set-car!
-:noname ( args -- pair )
+:noname ( args -- ok )
2dup 2 ensure-arg-count
2dup cdr car
2swap car pair-type ensure-arg-type
ok-symbol
; make-primitive set-cdr!
-( = Polymorphic equality testing = )
+\ }}}
+
+\ ==== Polymorphic equality testing ==== {{{
:noname ( args -- bool )
2dup 2 ensure-arg-count
objeq? boolean-type
; make-primitive eq?
+
+\ }}}
+
+\ ==== Input/Output ==== {{{
+
+:noname ( args -- finalResult )
+ 2dup 1 ensure-arg-count
+ car string-type ensure-arg-type
+
+ drop pair-type
+ pad charlist>cstr
+ pad swap load
+; make-primitive load
+
+:noname ( args -- obj )
+ 0 ensure-arg-count
+ read
+; make-primitive read
+
+defer display
+:noname ( args -- none )
+ 2dup 1 ensure-arg-count
+
+ car print
+
+ none
+; make-primitive write
+
+: displaypair ( pairobj -- )
+ 2dup
+ car display
+ cdr
+ nil? if 2drop exit then
+ pair-type istype? if space recurse exit then
+ ." . " display
+;
+
+: displaychar ( charobj -- )
+ drop emit ;
+
+: (displaystring) ( charlist -- )
+ nil? if
+ 2drop
+ else
+ 2dup car displaychar
+ cdr recurse
+ then
+;
+
+: displaystring ( stringobj -- )
+ drop pair-type (displaystring)
+;
+
+:noname ( obj -- )
+ pair-type istype? if ." (" displaypair ." )" exit then
+ character-type istype? if displaychar exit then
+ string-type istype? if displaystring exit then
+
+ print
+; is display
+
+:noname ( args -- none )
+ 2dup 1 ensure-arg-count
+ car string-type ensure-arg-type
+
+ displaystring
+
+ none
+; make-primitive display-string
+
+:noname ( args -- none )
+ 2dup 1 ensure-arg-count
+ car character-type ensure-arg-type
+
+ displaychar
+
+ none
+; make-primitive display-character
+
+:noname ( args -- none )
+ 2dup 1 ensure-arg-count
+ car
+
+ display
+
+ none
+; make-primitive display
+
+:noname ( args -- none )
+ 0 ensure-arg-count
+
+ cr
+
+ none
+; make-primitive newline
+
+\ }}}
+
+\ ==== Evaluation ==== {{{
+
+:noname ( args -- result )
+ 2dup car 2swap cdr
+
+ nil? false = if car then ( proc argvals )
+
+ apply
+; make-primitive apply
+
+\ }}}
+
+\ ==== Miscellaneous ==== {{{
+
+( Produce a recoverable exception. )
+:noname ( args -- result )
+ bold fg red
+
+ nil? if
+ ." Error."
+ else
+ ." Error: " car display
+ then
+
+ reset-term
+
+ recoverable-exception throw
+; make-primitive error
+
+( Generate a temporary unique symbol. Used in the creation of hygienic macros. )
+:noname ( args -- result )
+ 0 ensure-arg-count
+
+ [char] _ character-type nil cons
+ drop symbol-type
+; make-primitive gensym
+
+( Generate the NONE object indicating an unspecified return value. )
+:noname ( args -- result )
+ 0 ensure-arg-count
+
+ none
+; make-primitive none
+
+\ }}}
+
+\ vim:fdm=marker