X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fscheme.4th;h=3931dad19d68bd141f609ce8cb297a6634621cdd;hb=02868ff84afc9b2fb4fafa7247d09ee2a1e98f59;hp=6e2c49255a788a7293646ee0c5a751aab51dd7f9;hpb=5eea24f47ad60b69af59a76c7285ec232c29009c;p=scheme.forth.jl.git diff --git a/src/scheme.4th b/src/scheme.4th index 6e2c492..3931dad 100644 --- a/src/scheme.4th +++ b/src/scheme.4th @@ -1652,24 +1652,10 @@ hide env R> drop ['] eval goto-deferred \ Tail call optimization endof - except-message: ." object not applicable." recoverable-exception throw + except-message: ." object '" drop print ." ' not applicable." recoverable-exception throw endcase ; -( Simply evaluates the given procedure with expbody as its argument. ) -: macro-expand ( proc expbody -- result ) - 2swap - 2dup procedure-body ( expbody proc procbody ) - -2rot 2dup procedure-params ( procbody expbody proc argnames ) - -2rot procedure-env ( procbody argnames expbody procenv ) - - -2rot 2swap - flatten-proc-args - 2swap 2rot - - extend-env eval-sequence eval -; - :noname ( obj env -- result ) 2swap @@ -1749,34 +1735,65 @@ hide env 2over 2over ( env exp env exp ) operator ( env exp env opname ) - 2dup lookup-macro nil? false = if - \ Macro function evaluation + 2swap eval ( env exp proc ) - ( env exp env opname mproc ) - 2swap 2drop -2rot 2drop cdr ( env mproc body ) + -2rot ( proc env exp ) + operands 2swap ( proc operands env ) + list-of-vals ( proc argvals ) - macro-expand + apply + exit + then - 2swap - ['] eval goto-deferred - else - \ Regular function application + except-message: ." tried to evaluate object with unknown type." recoverable-exception throw +; is eval - 2drop ( env exp env opname ) +\ }}} - 2swap eval ( env exp proc ) +\ ---- Macro Expansion ---- {{{ - -2rot ( proc env exp ) - operands 2swap ( proc operands env ) - list-of-vals ( proc argvals ) +( Simply evaluates the given procedure with expbody as its argument. ) +: macro-eval ( proc expbody -- result ) + 2swap + 2dup procedure-body ( expbody proc procbody ) + -2rot 2dup procedure-params ( procbody expbody proc argnames ) + -2rot procedure-env ( procbody argnames expbody procenv ) + + -2rot 2swap + flatten-proc-args + 2swap 2rot - apply - exit - then - then + extend-env eval-sequence eval +; - except-message: ." tried to evaluate object with unknown type." recoverable-exception throw -; is eval +: expand-quasiquote ; +: expand-definition ; +: expand-assignment ; +: expand-define-macro ; +: expand-if ; +: expand-lambda ; +: expand-begin ; +: expand-application ; + +:noname ( exp -- result ) + + quasiquote? if expand-quasiquote exit then + + definition? if expand-definition exit then + + assignment? if expand-assignment exit then + + macro-definition? if expand-define-macro exit then + + if? if expand-if exit then + + lambda? if expand-lambda exit then + + begin? if expand-sequence exit then + + application? if expand-apply exit then + +; is expand \ }}} @@ -2004,6 +2021,8 @@ variable gc-stack-depth 2swap 2drop ( port obj ) + expand + global-env obj@ eval ( port res ) again ; @@ -2014,7 +2033,7 @@ variable gc-stack-depth include scheme-primitives.4th - s" scheme-library.scm" load 2drop +\ s" scheme-library.scm" load 2drop \ }}} @@ -2032,6 +2051,8 @@ variable gc-stack-depth true exit then + expand + global-env obj@ eval fg cyan ." ; " print reset-term @@ -2045,7 +2066,7 @@ variable gc-stack-depth enable-gc \ Display welcome message - welcome-symbol nil cons global-env obj@ eval 2drop + \ welcome-symbol nil cons global-env obj@ eval 2drop begin ['] repl-body catch