ref: 6cec07e20602ff1a19e3179c48ad11203c61c274
parent: 53b4d27243b9b20a6628aa200299c3b5ac6f173a
author: McKay Marston <[email protected]>
date: Mon Oct 19 18:17:58 EDT 2020
closer
--- a/macro.ml
+++ b/macro.ml
@@ -231,12 +231,13 @@
let symbol = (Printer.print sym true) in
let variants = ref Types.M9map.empty in
let rec register_variants clauses =
+ let new_sym = gen_sym symbol in
match clauses with
| [ pattern ] ->
- variants := Types.M9map.add (gen_sym symbol) pattern !variants;
+ variants := Types.M9map.add new_sym pattern !variants;
!variants
| pattern :: rest ->
- variants := Types.M9map.add (gen_sym symbol) pattern !variants;
+ variants := Types.M9map.add new_sym pattern !variants;
register_variants rest
| _ -> raise (Utils.Syntax_error "macro pattern registration botch")
in
--- a/reader.ml
+++ b/reader.ml
@@ -42,6 +42,22 @@
raise End_of_file)
;;
+let fix_pattern sym pattern =
+ let tokenized_pattern = tokenize pattern in
+ let new_pattern = ref [] in
+ let rec replace_token tokens =
+ match tokens with
+ | token :: [] -> let t = if token = "_" then (Printer.print sym true) else token in
+ new_pattern := !new_pattern @ [t];
+ !new_pattern
+ | token :: rest -> let t = if token = "_" then (Printer.print sym true) else token in
+ new_pattern := !new_pattern @ [t];
+ replace_token rest
+ | _ -> raise (Utils.Syntax_error "unable to fix pattern")
+ in
+ replace_token tokenized_pattern
+;;
+
let read_atom token =
match token with
| "null" -> T.Nil
@@ -121,7 +137,10 @@
print_endline (" variants: " ^ (Printer.print (Types.map variants) true));
let macro_entry = Types.macro sym literals (Types.list clauses) variants in
Env.set registered_macros sym macro_entry;
- Types.M9map.iter (fun k v -> print_endline (" >> " ^ Printer.print k true ^ ": " ^ Printer.print v true)) variants;
+ Types.M9map.iter (fun k v ->
+ print_endline (" >>> " ^ String.concat " " (fix_pattern k (Printer.print v true)));
+ print_endline (" >> " ^ Printer.print k true ^ ": " ^ Printer.print v true))
+ variants;
print_endline(" >>>>>> MACRO: " ^ Printer.print macro_entry true)
| _ -> raise (Utils.Syntax_error "read_macro botch"))
| _ as x -> print_endline (" rest: " ^ Printer.dump x));