ref: b6f4824d97a68ecfa763e1edcbef629ff3ba1cfc
parent: 271c7847be7a17ea20b84720a4b740255877da6c
author: McKay Marston <mckay.marston@greymanlabs.com>
date: Tue Oct 20 19:34:11 EDT 2020
more progress
--- a/eval.ml
+++ b/eval.ml
@@ -62,6 +62,7 @@
* | _ -> ast)
* | _ -> 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? *)
@@ -95,7 +96,7 @@
Env.set sub_env name arg;
bind_args names args
| [], [] -> ()
- | _ -> raise (Utils.Syntax_error "wrong parameter count for lambda")
+ | _ -> raise (Utils.Syntax_error ("wrong parameter count for lambda: " ^ Printer.dump arg_names))in
bind_args arg_names args;
eval expr sub_env)
--- a/macro.ml
+++ b/macro.ml
@@ -244,29 +244,27 @@
;;
let match_variant macro args =
- match macro with
- | T.Map { T.value = meta } ->- (match Types.M9map.find Types.macro_variants meta with
- | T.Map { T.value = variant_list } ->- Types.M9map.iter
- (fun k v ->
- print_endline (Printer.print k true ^ ": " ^ Printer.print v true);
- match v with
- | T.List { T.value = T.List { T.value = x } :: z } ->- print_endline
- (" !!! ["- ^ string_of_int (List.length args)
- ^ "]("- ^ string_of_int (List.length x)
- ^ ") "
- ^ Printer.dump x
- ^ " :: "
- ^ Printer.dump z);
- if List.length args = List.length x then print_endline "MATCH!" else print_endline "no match"
- | _ -> ())
- variant_list
- | _ -> ())
- | _ -> ()
+ let vmatch = ref "" in
+ (match macro with
+ | T.Map { T.value = meta } ->+ (match Types.M9map.find Types.macro_variants meta with
+ | T.Map { T.value = variant_list } ->+ Types.M9map.iter
+ (fun k v ->
+ print_endline (Printer.print k true ^ ": " ^ Printer.print v true);
+ match v with
+ | T.List { T.value = T.List { T.value = x } :: z } ->+ print_endline
+ (" >>>> [" ^ string_of_int (List.length args) ^ "|"+ ^ string_of_int (List.length x) ^ "] "
+ ^ Printer.dump x ^ " :: " ^ Printer.dump z);
+ if List.length args = List.length x
+ then vmatch := (Printer.print (List.hd x) true)
+ | _ -> ())
+ variant_list
+ | _ -> ())
+ | _ -> ());
+ !vmatch
;;
(* match meta with
--- a/notes.org
+++ b/notes.org
@@ -13,6 +13,7 @@
Right now you need to use lambda
** DONE (cons) doesn't work
This appears to work, now, but not with a pair
+** TODO make a "macro_reader" like a "list_reader"?
* Read
** macro "transformers" should be "clauses"
Which themselves consist of "pattern" -> "template"
--- a/reader.ml
+++ b/reader.ml
@@ -36,10 +36,7 @@
| "\\n" -> "\n"
| x -> String.sub x 1 1)
without_quotes)
- else (
- output_string stderr "expected '\"', got EOF\n";
- flush stderr;
- raise End_of_file)
+ else raise (Utils.Syntax_error "unterminated string")
;;
let fix_pattern sym pattern =
@@ -57,7 +54,7 @@
replace_token rest
| _ -> raise (Utils.Syntax_error "unable to fix pattern")
in
- replace_token tokenized_pattern
+ replace_token (List.hd tokenized_pattern :: "define" :: List.tl tokenized_pattern)
;;
let read_atom token =
@@ -91,19 +88,20 @@
| _ -> T.Nil
with
| T.Macro { T.value = sym; meta } ->- (* print_endline ("\nFOUND A MACRO! " ^ Printer.print sym true);- * print_endline (" tokens: " ^ String.concat " " list_reader.tokens); *)- let rec collect_args tokens args =
- match tokens with
- | [ t ] -> args @ [ t ]
- | t :: ts -> if t = eol then args else collect_args ts args @ [ t ]
- | _ -> []
- in
- let args = collect_args (List.tl list_reader.tokens) [] in
- Macro.match_variant meta args
+ print_endline ("XXXX MACRO FOUND");+ let rec collect_args tokens args =
+ match tokens with
+ | [ t ] -> args @ [ t ]
+ | t :: ts -> if t = eol then args else collect_args ts args @ [ t ]
+ | _ -> []
+ in
+ let args = collect_args (List.tl list_reader.tokens) [] in
+ print_endline ("<><><><>: " ^ Macro.match_variant meta args)| _ -> ());
match list_reader.tokens with
- | [] -> raise (Utils.Syntax_error ("unterminated '" ^ eol ^ "'"))+ | [] -> print_endline ("ERROR: " ^ Printer.dump list_reader.list_form);+ raise (Utils.Syntax_error ("unterminated '" ^ eol ^ "'"))+ | token :: [] -> { list_form = list_reader.list_form; tokens = [")"] }| token :: tokens ->
if Str.string_match (Str.regexp eol) token 0
then { list_form = list_reader.list_form; tokens }@@ -126,6 +124,7 @@
| _ -> read_form tokens)
and read_macro tokens =
+ let macro = ref [] in
let list_reader = read_list ")" { list_form = []; tokens } in print_endline ("MACRO: " ^ Printer.dump list_reader.list_form);(match list_reader.list_form with
@@ -139,12 +138,12 @@
Env.set registered_macros sym macro_entry;
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))+ print_endline (" >>> " ^ Printer.print k true ^ ": " ^ String.concat " " (fix_pattern k (Printer.print v true)));+ macro := !macro @ (fix_pattern k (Printer.print v true)))
variants
| _ -> raise (Utils.Syntax_error "read_macro botch"))
- | _ as x -> print_endline (" rest: " ^ Printer.dump x));- { form = Types.list list_reader.list_form; tokens = list_reader.tokens }+ | _ as x -> print_endline (" last rest: " ^ Printer.dump x));+ read_form !macro
and read_form all_tokens =
(* print_endline ("READ_FORM: " ^ String.concat " " all_tokens); *)--
⑨