\ ------ 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 -- )
- nil objeq? if
- 0 number-type
+ 2dup nil objeq? if
+ 2drop
+ 0 fixnum-type
else
- 2dup cdr recurse drop
- -rot car drop
- + number-type
+ 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
+ 1 fixnum-type
+ else
+ 2dup car drop
+ -rot cdr recurse drop
+ * fixnum-type
+ then
+; make-primitive *
+
\ }}}
\ ---- Read ---- {{{
: minus? ( -- bool )
nextchar [char] - = ;
-: number? ( -- bool )
- digit? minus? or false = if
- false
- exit
+: fixnum? ( -- bool )
+ minus? if
+ inc-parse-idx
+
+ delim? if
+ dec-parse-idx
+ false exit
+ else
+ dec-parse-idx
+ then
+ else
+ digit? false = if
+ false exit
+ then
then
push-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
: true? ( boolobj -- bool )
false? invert ;
-: applicaion? ( obj -- obj bool)
+: application? ( obj -- obj bool)
pair-type istype? ;
: operator ( obj -- operator )
cdr ;
: nooperands? ( operands -- bool )
- cdr nil objeq? ;
+ nil objeq? ;
: first-operand ( operands -- operand )
car ;
cdr ;
: list-of-vals ( args env -- vals )
+ 2swap
+ 2dup nooperands? if
+ 2swap 2drop
+ else
+ 2over 2over first-operand 2swap eval
+ -2rot rest-operands 2swap recurse
+ cons
+ then
;
:noname ( obj env -- result )
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