include term-colours.4th
include defer-is.4th
+include throw-catch.4th
+
+defer read
+defer eval
+defer print
\ ------ Types ------
-0 constant fixnum-type
-1 constant boolean-type
-2 constant character-type
-3 constant string-type
-4 constant nil-type
-5 constant pair-type
-6 constant symbol-type
-7 constant primitive-proc-type
-8 constant compound-proc-type
+variable nexttype
+0 nexttype !
+: make-type
+ create nexttype @ ,
+ nexttype @ 1+ nexttype !
+ does> @ ;
+
+make-type fixnum-type
+make-type real-type
+make-type boolean-type
+make-type character-type
+make-type string-type
+make-type nil-type
+make-type pair-type
+make-type symbol-type
+make-type primitive-proc-type
+make-type compound-proc-type
: istype? ( obj type -- obj bool )
over = ;
\ ------ Cons cell memory ------ {{{
-1000 constant N
+10000 constant N
create car-cells N allot
create car-type-cells N allot
create cdr-cells N allot
\ ---- Read ---- {{{
-defer read
-
variable parse-idx
variable stored-parse-idx
create parse-str 161 allot
\ ---- Eval ---- {{{
-defer eval
-
: self-evaluating? ( obj -- obj bool )
boolean-type istype? if true exit then
fixnum-type istype? if true exit then
begin
2dup cdr 2dup nil objeq? false =
while
- -2rot car over ( nextbody env exp env )
+ -2rot car 2over ( nextbody env exp env )
eval
2drop \ discard result
2swap ( env nextbody )
2drop ( env body )
car 2swap ( exp env )
- ['] eval goto-prime \ Tail call optimization
- \ eval \ No tail call optimization
+ R> drop ['] eval goto-deferred \ Tail call optimization
endof
bold fg red ." Object not applicable. Aboring." reset-term cr
if-alternative
then
- 2swap ['] eval goto
+ 2swap
+ ['] eval goto-deferred
then
lambda? if
\ ---- Print ---- {{{
-defer print
-
: printnum ( numobj -- ) drop 0 .R ;
: printbool ( numobj -- )