shithub: martian9

Download patch

ref: ae95184e6aa4685bbd13ed4b58df2fcc3e1f625c
parent: 0623a5a458b36ae4cd3f2b4ef0a34b7e124a99ab
author: smazga <smazga@greymanlabs.com>
date: Thu Aug 13 18:31:45 EDT 2020

even more macro stuff

--- a/m9.ml
+++ b/m9.ml
@@ -35,7 +35,6 @@
 let is_macro_call ast env =
   match ast with
   | T.List { T.value = s :: args } ->
-     print_endline ("is_macro_call: sym: " ^ Printer.print s true ^ "  args: " ^ Printer.dump args);
     (match
        try Env.get env s with
        | _ -> T.Nil
@@ -43,11 +42,24 @@
     | T.Proc { T.meta = T.Map { T.value = meta } } ->
       Types.M9map.mem Core.kw_macro meta
       && Types.to_bool (Types.M9map.find Core.kw_macro meta)
-    (* | T.List { T.value = foo } -> print_endline ("foo: " ^ Printer.dump foo); false *)
-    | T.List { T.value = [ T.Symbol { T.value = "syntax-rules" }; args ] }-> true
+    | T.List { T.value = macro } -> (match macro with
+                                   | kw :: _ -> kw = Types.symbol "syntax-rules"
+                                   | _ -> false)
     | _ -> false)
   | _ -> false
 ;;
+let eval_macro sym args macro env =
+  let parsed = Str.global_replace (Str.regexp "(_") ("(" ^ Printer.print sym true) (Printer.dump macro) in
+  print_endline ("eval_macro: sym:" ^ Printer.print sym true ^ " args:" ^ Printer.dump args ^ " macro:" ^ Printer.dump macro);
+  print_endline ("  parsed: " ^ parsed)
+(*   let sub_env = Env.make (Some env) in
+ *   match macro with
+ *   | _ :: literals :: cases ->
+ *      (match cases with
+ *       | hd :: tl ->
+ * (\* TODO: handle literals *\)
+ *      )
+ *   | _ -> () *)
 
 let rec macroexpand ast env =
   if is_macro_call ast env
@@ -55,16 +67,17 @@
     print_endline ("  YES!: " ^ Printer.print ast true);
     match ast with
     | T.List { T.value = s :: args } ->
+       print_endline ("one: s: " ^ Printer.print s true ^ " args: " ^ Printer.dump args);
       (match
          try Env.get env s with
          | _ -> T.Nil
        with
-      | T.Proc { T.value = f } -> macroexpand (f args) env
+       | T.Proc { T.value = f } -> macroexpand (f args) env
+       | T.List { T.value = macro } -> eval_macro s args macro env; ast
       | _ -> ast)
     | _ -> ast)
   else
-    (print_endline ("  no: " ^ Printer.print ast true);
-     ast)
+     ast
 ;;
 
 let rec eval_ast ast env =