ref: 89403fb391d40dee3ee3ca6b59a70d07d04de1c2
parent: a3761f1b564b3a2574fc038a352f332190a78344
author: smazga <smazga@greymanlabs.com>
date: Fri Aug 21 16:02:54 EDT 2020
stuff
--- a/core.ml
+++ b/core.ml
@@ -104,8 +104,8 @@
env
(Types.symbol "display")
(Types.proc (function xs ->
- print_string (String.concat " " (List.map (fun s -> Printer.print s false) xs));
- T.Eof_object));
+ print_string (Printer.stringify xs false);
+ T.Unspecified));
Env.set
env
(Types.symbol "string")
--- a/m9.ml
+++ b/m9.ml
@@ -32,53 +32,82 @@
| ast -> Types.list [ Types.symbol "quote"; ast ]
;;
-let eval_macro sym args env meta =
+let rec eval_ast ast env =
+ match ast with
+ | T.Symbol s -> Env.get env ast
+ | T.List { T.value = xs; T.meta } ->
+ T.List { T.value = List.map (fun x -> eval x env) xs; T.meta }
+ | T.Vector { T.value = xs; T.meta } ->
+ T.Vector { T.value = List.map (fun x -> eval x env) xs; T.meta }
+ | _ -> ast
+
+and eval_macro sym args env 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
+ (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);
+ 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 ("__ arg length: " ^ string_of_int (List.length args));
- let foo = T.List hd in
- print_endline ("__ transform length: " ^ string_of_int (List.length foo));
- match_transform tl
- | [] -> ())
+ match transforms with
+ | hd :: tl ->
+ print_endline ("__ hd: " ^ Printer.print hd true);
+ print_endline ("__ arg length: " ^ string_of_int (List.length args));
+ (match hd with
+ | T.List
+ { T.value = [ T.List { T.value = pattern }; T.List { T.value = body } ] }
+ ->
+ print_endline (" _ pattern: " ^ Printer.dump pattern);
+ print_endline
+ ("__ pattern length: "
+ ^ string_of_int (List.length pattern)
+ ^ " body: "
+ ^ Printer.dump body)
+ | T.List { T.value = [ T.List { T.value = pattern }; atom ] } ->
+ print_endline (" _ pattern: " ^ Printer.dump pattern);
+ print_endline
+ ("__ atomic pattern length: "
+ ^ string_of_int (List.length pattern)
+ ^ " atom: "
+ ^ Printer.print atom true)
+ | _ -> ());
+ let foo = Reader.read (Printer.print hd false) in
+ print_endline (" foo: " ^ Printer.print foo true);
+ (* print_endline ("__ transform length: " ^ string_of_int (List.length foo)); *)
+ match_transform tl
+ | [] -> ()
in
match_transform (Core.seq transformers)
- with Not_found -> ())
+ with
+ | Not_found -> ())
| _ -> ()
-;;
-let rec preparse ast env =
- match ast with
- | T.List { T.value = s :: args } ->
- (match
- try Env.get env s with
- | _ -> T.Nil
- with
- | T.Macro { T.value = s; meta = m } ->
- print_endline (" THIS IS A MACRO: " ^ Printer.print s true);
- print_endline (" META: " ^ Printer.print m true);
- print_endline (" ARGS: " ^ Printer.dump args);
- eval_macro s args env m; ast
- | _ -> ast)
- | _ -> ast
-;;
-
-let rec eval_ast ast env =
+and preparse ast env =
match ast with
- | T.Symbol s -> Env.get env ast
- | T.List { T.value = xs; T.meta } ->
- T.List { T.value = List.map (fun x -> eval x env) xs; T.meta }
- | T.Vector { T.value = xs; T.meta } ->
- T.Vector { T.value = List.map (fun x -> eval x env) xs; T.meta }
- | T.Macro { T.value = m } ->
- print_endline ("wait, what? " ^ Printer.print m true);
- T.Nil
+ | T.List { T.value = s :: args } ->
+ (match
+ try Env.get env s with
+ | _ -> T.Nil
+ with
+ | T.Macro { T.value = s; meta = m } ->
+ print_endline (" THIS IS A MACRO: " ^ Printer.print s true);
+ print_endline (" META: " ^ Printer.print m true);
+ print_endline (" ARGS: " ^ Printer.dump args);
+ print_endline (" AST: " ^ Printer.print ast true);
+ eval_macro s args env m;
+ ast
+ | _ -> ast)
| _ -> ast
and eval ast env =
@@ -94,7 +123,7 @@
eval
(Reader.read
("(lambda ("
- ^ String.concat " " (List.map (fun x -> Printer.print x false) rest)
+ ^ Printer.stringify rest false
^ ") "
^ Printer.print body true
^ ")"))
--- a/notes.org
+++ b/notes.org
@@ -14,8 +14,12 @@
** DONE (cons) doesn't work
This appears to work, now, but not with a pair
* Read
+** macro "transformers" should be "clauses"
+Which themselves consist of "pattern" -> "template"
** DONE "quote" and "quasiquote" symbols not supported
The shortcuts work, but not the keywords
+** TODO switch "define-syntax" to "let-syntax" format
+I think 'let-syntax' is the better building block
* Eval
* Things to watch for
--- a/printer.ml
+++ b/printer.ml
@@ -25,12 +25,12 @@
xs
""
^ "}"
- | T.Comment -> "" (* TODO: this leaves a space in the output for block comments *)
+ | T.Unspecified -> "#unspecified"
+ | T.Eof_object -> "#eof"
(* | T.Pair ({ T.value = one }, { T.value = two }) -> "(" ^ (print one readable) ^ " . " ^ (print two readable) ^ ")" *)
| T.Proc p -> "#<proc>"
| T.Symbol { T.value = s } -> s
| T.Bytevector bv -> "<bytevector unsupported>"
- | T.Eof_object -> "<eof>"
| T.Number n ->
if Types.is_float n.value
then string_of_float n.value
@@ -49,10 +49,16 @@
^ "\""
else s
| T.List { T.value = xs } ->
- "(|" ^ String.concat " " (List.map (fun s -> print s r) xs) ^ "|)"
+ "(" ^ stringify xs r ^ ")"
| T.Vector { T.value = v } ->
- "#(" ^ String.concat " " (List.map (fun s -> print s r) v) ^ ")"
+ "#(" ^ stringify v r ^ ")"
| T.Record r -> "<record unsupported>"
+
+and stringify obj human =
+ String.concat " " (List.filter (function
+ | T.Unspecified
+ | T.Eof_object -> human
+ | _ -> true) obj |> List.map (fun s-> print s human))
;;
let dump obj = String.concat " " (List.map (fun s -> print s true) obj)
--- a/reader.ml
+++ b/reader.ml
@@ -116,7 +116,7 @@
| "#" -> read_vector tokens
| "#|" ->
let list_reader = read_list "|#" { list_form = []; tokens } in
- { form = T.Comment; tokens = list_reader.tokens }
+ { form = T.Unspecified; tokens = list_reader.tokens }
| "(" ->
let list_reader = read_list ")" { list_form = []; tokens } in
{ form = Types.list list_reader.list_form; tokens = list_reader.tokens }
--- a/types.ml
+++ b/types.ml
@@ -11,13 +11,13 @@
| Bool of bool
| Char of char
| Nil
- | Comment
+ | Unspecified
+ | Eof_object
(* | Pair of t with_meta * t list *)
| Proc of (t list -> t) with_meta
| Symbol of string with_meta
| Macro of t with_meta
| Bytevector of t list
- | Eof_object
| Number of float with_meta
| Port of bool (* not sure how to represent this *)
| String of string