Added macro expansion skeleton.
[scheme.forth.jl.git] / src / scheme.4th
index 6e2c492..1068229 100644 (file)
@@ -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,56 @@ 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
+
+\ }}}
+
+\ ---- Macro Expansion ---- {{{
+
+( 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
 
-            2drop ( env exp env opname )
+    extend-env eval-sequence eval
+;
 
-            2swap eval ( env exp proc )
+:noname ( exp -- result )
 
-            -2rot ( proc env exp )
-            operands 2swap ( proc operands env )
-            list-of-vals ( proc argvals )
+    quasiquote? if expand-quasiquote exit then
 
-            apply
-            exit
-        then
-    then
+    definition? if expand-definition exit then
 
-    except-message: ." tried to evaluate object with unknown type." recoverable-exception throw
-; is eval
+    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 +2012,8 @@ variable gc-stack-depth
 
         2swap 2drop ( port obj )
 
+        expand
+
         global-env obj@ eval ( port res )
     again
 ;
@@ -2014,7 +2024,7 @@ variable gc-stack-depth
 
     include scheme-primitives.4th
 
-    s" scheme-library.scm" load 2drop
+\    s" scheme-library.scm" load 2drop
     
 \ }}}
 
@@ -2032,6 +2042,8 @@ variable gc-stack-depth
         true exit
     then
 
+    expand
+
     global-env obj@ eval
 
     fg cyan ." ; " print reset-term
@@ -2045,7 +2057,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