ref: df79e7e4c7f40d06925385e94365b5cba554f1fe
dir: /macro.ml/
module T = Types.Types let rec is_matching_pattern sym pattern args matched = match pattern, args with (* literals not handled, yet *) | ph :: pt, ah :: at -> print_endline " LIST <-> LIST"; if (ph = "_" || (ph = (Printer.print sym true) && ph = (Printer.print ah true))) then is_matching_pattern sym pt at matched && true else is_matching_pattern sym pt at matched | ph :: pt, [] -> print_endline " LIST <-> []"; if (ph = "_" || ph = (Printer.print sym true)) then is_matching_pattern sym pt [] matched && true else false | _, _ -> matched let rec expand ast env args sym meta = print_endline ("\n\nTHIS IS A MACRO: " ^ Printer.print sym true); print_endline (" META: " ^ Printer.print meta true); print_endline (" ARGS: " ^ Printer.dump args); print_endline (" AST: " ^ Printer.print ast true); (* and expand args env sym meta = *) (* let sub_env = Env.make (Some env) in * Env.set * sub_env * (Types.symbol "_") * (Types.proc (function * | [ ast ] -> eval ast sub_env * | _ -> T.Nil)); *) match meta with | T.Map { T.value = m } -> (try let literals = Types.M9map.find Types.macro_literals m in let transformers = Types.M9map.find Types.macro_transformers m in print_endline (" -- EVAL_MACRO: literals: " ^ Printer.print literals true ^ " transformers: " ^ Printer.print transformers true); let rec match_transform transforms = match transforms with | hd :: tl -> print_endline (" __ hd: " ^ Printer.print hd true); print_endline (" __ args: " ^ Printer.dump args); (match hd with | T.List { T.value = [ T.List { T.value = pattern }; T.List { T.value = template } ] } -> print_endline (" _ multi pattern: " ^ Printer.dump pattern); match_transform tl | T.List { T.value = [ T.List { T.value = pattern }; atom ] } -> print_endline (" _ single pattern: " ^ Printer.dump pattern); print_endline ("matched?: " ^ (if is_matching_pattern sym (List.map (fun x -> Printer.print x true) pattern) args true then "yes" else "no")); if is_matching_pattern sym (List.map (fun x -> Printer.print x true) pattern) args true then atom else match_transform tl | _ -> ast) | [] -> ast in match_transform (Core.seq transformers) with | Not_found -> ast) | _ -> ast