X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme.4th;h=8bc44d3ad9693c76273660e20f42cac8b5ac9941;hb=215a272cf2521c34e9f8d2be62db1a35ac0a9809;hp=7fa85ac2e92786ad183b95721d6b3c6d3cf02a89;hpb=a5871b187b34ca1eaf925658c1bc49a547593396;p=scheme.forth.jl.git diff --git a/scheme.4th b/scheme.4th index 7fa85ac..8bc44d3 100644 --- a/scheme.4th +++ b/scheme.4th @@ -3,6 +3,11 @@ scheme definitions include term-colours.4th include defer-is.4th +include catch-throw.4th + +defer read +defer eval +defer print \ ------ Types ------ @@ -20,7 +25,7 @@ include defer-is.4th \ ------ 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 @@ -376,8 +381,6 @@ include scheme-primitives.4th \ ---- Read ---- {{{ -defer read - variable parse-idx variable stored-parse-idx create parse-str 161 allot @@ -785,8 +788,6 @@ parse-idx-stack parse-idx-sp ! \ ---- Eval ---- {{{ -defer eval - : self-evaluating? ( obj -- obj bool ) boolean-type istype? if true exit then fixnum-type istype? if true exit then @@ -945,6 +946,15 @@ defer eval 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 @@ -952,9 +962,27 @@ defer eval 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 @@ -1002,7 +1030,8 @@ defer eval if-alternative then - 2swap ['] eval goto + 2swap + ['] eval goto-deferred then lambda? if @@ -1030,8 +1059,6 @@ defer eval \ ---- Print ---- {{{ -defer print - : printnum ( numobj -- ) drop 0 .R ; : printbool ( numobj -- )