shithub: martian9

Download patch

ref: bfe18062adfcad6af73f1b5ab204763df12649a6
parent: 2b66d7d69e8f6da6f2f211c7fd3636b586588053
author: smazga <smazga@greymanlabs.com>
date: Sat Oct 10 16:11:22 EDT 2020

macro

--- a/eval.ml
+++ b/eval.ml
@@ -27,11 +27,12 @@
                                           try Env.get env (List.hd xs) with
                                           | _ -> T.Nil
                                         with
-                                        | T.Macro { T.value = sym; meta } -> print_endline ("  EVAL_AST: the rest: " ^ Printer.dump (List.tl xs));
+                                        | T.Macro { T.value = sym; meta } as om -> print_endline ("  EVAL_AST: the rest: " ^ Printer.dump (List.tl xs));
                                                                              print_endline ("  EVAL_AST: AST: " ^ Printer.print ast true);
                                                                              let foo = Macro.expand ast env (List.tl xs) sym meta in
                                                                              print_endline (" expanded: " ^ Printer.print foo true);
-                                                                             T.List { T.value = [foo]; T.meta }
+                                                                             T.List { T.value = [ om; foo ]; T.meta }
+                                                                             (* T.List { T.value = [foo]; T.meta } *)
                                                                              (* T.List { T.value = [ Types.symbol (Printer.print sym true); foo; T.List { T.value = (List.tl xs); T.meta } ]; T.meta } *)
                                                                              (* T.List { T.value = [eval foo env]; T.meta } *)
                                                                              (* eval foo env *)
@@ -57,6 +58,7 @@
  *   | _ -> ast *)
 
 and eval ast env =
+  print_endline ("AST: " ^ Printer.print ast true);
   match ast with
   | T.List { T.value = [] } -> ast
   (* Can this be replaced with a define-syntax thing? *)
@@ -118,7 +120,7 @@
   | T.List _ ->
     (match eval_ast ast env with
      | T.List { T.value = T.Proc { T.value = f } :: args } -> f args
-     | T.List { T.value = macro } -> List.map (fun x -> eval x env) macro
+     | T.List { T.value = T.Macro { T.value = _ } :: macro :: _ } -> print_endline "MACRO EVALUATION"; eval macro env
     (* | T.List { T.value = T.Macro { T.value = sym; meta } :: args } ->
      *   (\* eval (Macro.expand ast env args sym meta) env *\)
      *   let foo = Macro.expand ast env args sym meta in
--- a/macro.ml
+++ b/macro.ml
@@ -102,7 +102,7 @@
     print_endline ("  lambdaize short list: " ^ expr);
     Reader.read expr
   | ph :: pt, [] ->
-    let expr = "'(lambda (" ^ Printer.stringify pt false ^ ") " ^ Printer.print template false ^ ")" in
+    let expr = "((lambda (" ^ Printer.stringify pt false ^ ") " ^ Printer.print template false ^ "))" in
     print_endline ("  lambdaize empty list: " ^ expr);
     Reader.read expr
   | _ ->
--- a/notes.org
+++ b/notes.org
@@ -39,6 +39,7 @@
 Eval seems too late to handle it, so maybe try to do expansion at read?
 
 So, at read, do an expansion and store the macro variants with unique names
+Then, when the original macro is called again, match the pattern and sub-in the appropriate variant.
 * Macros
 ** and
 (define-syntax and (syntax-rules ()