\ ------ Types ------
-0 constant number-type
+0 constant fixnum-type
1 constant boolean-type
2 constant character-type
3 constant string-type
global-env fetchobj define-var
;
+( = Arithmeic = )
+
+: add-prim ( args -- )
+ 2dup nil objeq? if
+ 2drop
+ 0 fixnum-type
+ else
+ 2dup car drop
+ -rot cdr recurse drop
+ + fixnum-type
+ then
+;
+' add-prim make-primitive +
+
+:noname ( args -- )
+ 2dup nil objeq? if
+ 2drop
+ 0 fixnum-type
+ else
+ 2dup car drop
+ -rot cdr add-prim drop
+ - fixnum-type
+ then
+; make-primitive -
+
:noname ( args -- )
2dup nil objeq? if
2drop
- 0 number-type
+ 1 fixnum-type
else
- 2dup cdr recurse drop
- -rot car drop
- + number-type
+ 2dup car drop
+ -rot cdr recurse drop
+ * fixnum-type
then
-; make-primitive +
+; make-primitive *
\ }}}
: minus? ( -- bool )
nextchar [char] - = ;
-: number? ( -- bool )
+: fixnum? ( -- bool )
minus? if
inc-parse-idx
swap if negate then
- number-type
+ fixnum-type
;
: readbool ( -- bool-atom )
eatspaces
- number? if
+ fixnum? if
readnum
exit
then
: self-evaluating? ( obj -- obj bool )
boolean-type istype? if true exit then
- number-type istype? if true exit then
+ fixnum-type istype? if true exit then
character-type istype? if true exit then
string-type istype? if true exit then
nil-type istype? if true exit then
2drop ." <primitive procedure>" ;
:noname ( obj -- )
- number-type istype? if printnum exit then
+ fixnum-type istype? if printnum exit then
boolean-type istype? if printbool exit then
character-type istype? if printchar exit then
string-type istype? if printstring exit then