include term-colours.4th
include defer-is.4th
+include throw-catch.4th
+
+defer read
+defer eval
+defer print
\ ------ Types ------
\ ------ 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
then
;
+: procedure-params ( proc -- params )
+ drop pair-type car ;
+
+: procedure-body ( proc -- body )
+ drop pair-type cdr car ;
+
+: procedure-env ( proc -- body )
+ drop pair-type cdr cdr car ;
+
: apply ( proc args )
2swap dup case
primitive-proc-type of
endof
compound-proc-type of
- 2drop 2drop
- ." Compound procedures not yet implemented." cr
- ok-symbol
+ 2dup procedure-body ( args proc body )
+ -2rot 2dup procedure-params ( body args proc params )
+ -2rot procedure-env ( body params args procenv )
+
+ extend-env ( body env )
+
+ 2swap ( env body )
+
+ begin
+ 2dup cdr 2dup nil objeq? false =
+ while
+ -2rot car 2over ( nextbody env exp env )
+ eval
+ 2drop \ discard result
+ 2swap ( env nextbody )
+ repeat
+
+ 2drop ( env body )
+ car 2swap ( exp env )
+
+ 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 -- )