X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=scheme.4th;h=3f57b1f084180d15b10b90a95efe8a4849206abe;hb=22c0956408483a13192e8eea0f3e78b75459d66d;hp=825ba58c809fad5fcf623340e0eccd52135fcf7c;hpb=b517ccae17c7de79cb28166c3f4ea28dcbb03a3d;p=scheme.forth.jl.git diff --git a/scheme.4th b/scheme.4th index 825ba58..3f57b1f 100644 --- a/scheme.4th +++ b/scheme.4th @@ -121,7 +121,7 @@ create-symbol set! set!-symbol \ ---- Environments ---- -objvar global-environment +objvar global-env : enclosing-env ( env -- env ) cdr ; @@ -139,8 +139,101 @@ objvar global-environment cdr ; : add-binding ( var val frame -- ) + 2swap 2over frame-vals cons + 2over set-car! + 2swap 2over frame-vars cons + swap set-cdr! ; + +: extend-env ( vars vals env -- env ) + >R >R + make-frame + R> R> + cons +; + +objvar vars +objvar vals + +: lookup-var-frame ( var frame -- val? bool ) + 2dup frame-vars vars setobj + frame-vals vals setobj + + begin + vars fetchobj nil objeq? false = + while + 2dup vars fetchobj car objeq? if + 2drop + vals fetchobj car true + exit + then + + vars fetchobj cdr vars setobj + vals fetchobj cdr vals setobj + repeat + + 2drop false +; + +: lookup-var ( var env -- val ) + begin + 2dup nil objeq? false = + while + 2over 2over first-frame + lookup-var-frame if + -rot 2drop -rot 2drop + exit + then + + enclosing-env + repeat + + bold fg red ." Unbound variable. Aborting." reset-term cr + abort +; + +objvar val + +: set-var-frame ( var frame -- ) + 2dup frame-vars vars setobj + frame-vals vals setobj + + begin + vars fetchobj nil objeq? false = + while + 2dup vars fetchobj car objeq? if + 2drop + \ *** TODO *** + then + + vars fetchobj cdr vars setobj + vals fetchobj cdr vals setobj + repeat +; + + +: set-var ( var val env -- ) + + 2swap val setobj + begin + 2dup nil objeq? false = + while + 2over 2over first-frame + set-var-frame if + exit + then + + enclosing-env + repeat + + bold fg red ." Unbound variable. Aborting." reset-term cr + abort +; + +hide vars +hide vals +hide val \ ---- Read ---- @@ -558,7 +651,7 @@ defer read quit then - \ Anything else is assumed to be a symbol + \ Anything else is parsed as a symbol readsymbol charlist>symbol ; is read @@ -589,13 +682,17 @@ defer read : quote-body ( quote-obj -- quote-body-obj ) cadr ; -: eval +: eval ( obj env -- result ) + 2swap + self-evaluating? if + 2swap 2drop exit then quote? if quote-body + 2swap 2drop exit then @@ -688,7 +785,7 @@ defer print begin cr bold fg green ." > " reset-term read - eval + global-env fetchobj eval fg cyan ." ; " print reset-term again ;