From 59d10e1bd703f65e12fef85bceef4204f82685fb Mon Sep 17 00:00:00 2001 From: Chouser Date: Thu, 22 Jan 2015 02:59:48 -0500 Subject: Ocaml: Added step 1, missing some optional functionality --- ocaml/printer.ml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 ocaml/printer.ml (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml new file mode 100644 index 0000000..30e4415 --- /dev/null +++ b/ocaml/printer.ml @@ -0,0 +1,15 @@ +let join sep xs = + List.fold_left (fun a x -> if a = "" then x else a ^ sep ^ x) "" xs + +let rec pr_str mal_obj = + match mal_obj with + | Types.Int i -> string_of_int i + | Types.Symbol s -> s + | Types.Keyword s -> ":" ^ s + | Types.Nil -> "nil" + | Types.Bool true -> "true" + | Types.Bool false -> "false" + | Types.String s -> "\"" + ^ (Str.global_replace (Str.regexp "\"") "\\\"" s) + ^ "\"" + | Types.MalList xs -> "(" ^ (join " " (List.map pr_str xs)) ^ ")" -- cgit v1.2.3 From 921a951fe4d088e60ce25866344bd534420f9ec6 Mon Sep 17 00:00:00 2001 From: Chouser Date: Thu, 22 Jan 2015 02:59:48 -0500 Subject: Ocaml: Add step 2, nothing optional --- ocaml/printer.ml | 1 + 1 file changed, 1 insertion(+) (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml index 30e4415..e87b3eb 100644 --- a/ocaml/printer.ml +++ b/ocaml/printer.ml @@ -13,3 +13,4 @@ let rec pr_str mal_obj = ^ (Str.global_replace (Str.regexp "\"") "\\\"" s) ^ "\"" | Types.MalList xs -> "(" ^ (join " " (List.map pr_str xs)) ^ ")" + | Types.Fn f -> "" -- cgit v1.2.3 From de04357cd5f2954e2d682abb97ca2b3b90ea75d1 Mon Sep 17 00:00:00 2001 From: Chouser Date: Fri, 23 Jan 2015 20:05:03 -0500 Subject: Ocaml: Add string functions --- ocaml/printer.ml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml index e87b3eb..fc9e47b 100644 --- a/ocaml/printer.ml +++ b/ocaml/printer.ml @@ -1,7 +1,7 @@ let join sep xs = List.fold_left (fun a x -> if a = "" then x else a ^ sep ^ x) "" xs -let rec pr_str mal_obj = +let rec pr_str mal_obj print_readably = match mal_obj with | Types.Int i -> string_of_int i | Types.Symbol s -> s @@ -9,8 +9,10 @@ let rec pr_str mal_obj = | Types.Nil -> "nil" | Types.Bool true -> "true" | Types.Bool false -> "false" - | Types.String s -> "\"" - ^ (Str.global_replace (Str.regexp "\"") "\\\"" s) - ^ "\"" - | Types.MalList xs -> "(" ^ (join " " (List.map pr_str xs)) ^ ")" - | Types.Fn f -> "" + | Types.String s -> + if print_readably + then "\"" ^ (Str.global_replace (Str.regexp "\\([\"\\]\\)") "\\\\\\1" s) ^ "\"" + else s + | Types.MalList xs -> + "(" ^ (join " " (List.map (fun s -> pr_str s print_readably) xs)) ^ ")" + | Types.Fn f -> "#" -- cgit v1.2.3 From f2f11f6279e1b242ba75136cd037fabdd176118a Mon Sep 17 00:00:00 2001 From: Chouser Date: Fri, 23 Jan 2015 22:54:15 -0500 Subject: Ocaml: rename Types.MalList to Types.List --- ocaml/printer.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml index fc9e47b..59c025d 100644 --- a/ocaml/printer.ml +++ b/ocaml/printer.ml @@ -13,6 +13,6 @@ let rec pr_str mal_obj print_readably = if print_readably then "\"" ^ (Str.global_replace (Str.regexp "\\([\"\\]\\)") "\\\\\\1" s) ^ "\"" else s - | Types.MalList xs -> + | Types.List xs -> "(" ^ (join " " (List.map (fun s -> pr_str s print_readably) xs)) ^ ")" | Types.Fn f -> "#" -- cgit v1.2.3 From b7ffcab96166f15d6203551ffbc487da5076f92e Mon Sep 17 00:00:00 2001 From: Chouser Date: Sat, 24 Jan 2015 00:44:51 -0500 Subject: Ocaml: Add read, print for vector, map --- ocaml/printer.ml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml index 59c025d..1257a69 100644 --- a/ocaml/printer.ml +++ b/ocaml/printer.ml @@ -1,7 +1,16 @@ let join sep xs = List.fold_left (fun a x -> if a = "" then x else a ^ sep ^ x) "" xs -let rec pr_str mal_obj print_readably = +let rec pr_pairs xs str print_readably = match xs with + | k :: v :: more -> pr_pairs more ((if str = "" then str else (str ^ ", ")) + ^ (pr_str k print_readably) + ^ " " + ^ (pr_str v print_readably)) + print_readably + | _ :: [] -> raise (Invalid_argument "Partition requires even number of items") + | [] -> str + +and pr_str mal_obj print_readably = match mal_obj with | Types.Int i -> string_of_int i | Types.Symbol s -> s @@ -15,4 +24,7 @@ let rec pr_str mal_obj print_readably = else s | Types.List xs -> "(" ^ (join " " (List.map (fun s -> pr_str s print_readably) xs)) ^ ")" + | Types.Vector xs -> + "[" ^ (join " " (List.map (fun s -> pr_str s print_readably) xs)) ^ "]" + | Types.Map xs -> "{" ^ pr_pairs xs "" print_readably ^ "}" | Types.Fn f -> "#" -- cgit v1.2.3 From a878f3bb778513c0cc8bbeb1a8ff61664e43de29 Mon Sep 17 00:00:00 2001 From: Chouser Date: Sun, 25 Jan 2015 23:30:37 -0500 Subject: Ocaml: Use a real map type T.Map is now a real OCaml binary-tree map, and supports arbitrary mal value types for both keys and values. Metadata support is provided in the data objects, but not yet in the printer, reader, or core library. --- ocaml/printer.ml | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml index 1257a69..3e09019 100644 --- a/ocaml/printer.ml +++ b/ocaml/printer.ml @@ -1,30 +1,27 @@ +module T = Types.Types + let join sep xs = List.fold_left (fun a x -> if a = "" then x else a ^ sep ^ x) "" xs -let rec pr_pairs xs str print_readably = match xs with - | k :: v :: more -> pr_pairs more ((if str = "" then str else (str ^ ", ")) - ^ (pr_str k print_readably) - ^ " " - ^ (pr_str v print_readably)) - print_readably - | _ :: [] -> raise (Invalid_argument "Partition requires even number of items") - | [] -> str - -and pr_str mal_obj print_readably = - match mal_obj with - | Types.Int i -> string_of_int i - | Types.Symbol s -> s - | Types.Keyword s -> ":" ^ s - | Types.Nil -> "nil" - | Types.Bool true -> "true" - | Types.Bool false -> "false" - | Types.String s -> - if print_readably - then "\"" ^ (Str.global_replace (Str.regexp "\\([\"\\]\\)") "\\\\\\1" s) ^ "\"" - else s - | Types.List xs -> - "(" ^ (join " " (List.map (fun s -> pr_str s print_readably) xs)) ^ ")" - | Types.Vector xs -> - "[" ^ (join " " (List.map (fun s -> pr_str s print_readably) xs)) ^ "]" - | Types.Map xs -> "{" ^ pr_pairs xs "" print_readably ^ "}" - | Types.Fn f -> "#" +let rec pr_str mal_obj print_readably = + let r = print_readably in + match mal_obj with + | T.Int i -> string_of_int i + | T.Symbol { T.value = s } -> s + | T.Keyword s -> ":" ^ s + | T.Nil -> "nil" + | T.Bool true -> "true" + | T.Bool false -> "false" + | T.String s -> + if r + then "\"" ^ (Str.global_replace (Str.regexp "\\([\"\\]\\)") "\\\\\\1" s) ^ "\"" + else s + | T.List { T.value = xs } -> + "(" ^ (join " " (List.map (fun s -> pr_str s r) xs)) ^ ")" + | T.Vector { T.value = xs } -> + "[" ^ (join " " (List.map (fun s -> pr_str s r) xs)) ^ "]" + | T.Map { T.value = xs } -> + (Types.MalMap.fold (fun k v s -> s ^ (if s = "" then "{" else ", ") ^ (pr_str k r) + ^ " " ^ (pr_str v r)) xs "") + ^ "}" + | T.Fn f -> "#" -- cgit v1.2.3 From e64878d0af10d7e391e2070ddd02756042bec7b9 Mon Sep 17 00:00:00 2001 From: Chouser Date: Mon, 26 Jan 2015 19:16:23 -0500 Subject: Ocaml: add meta, with-meta, and ^ reader support --- ocaml/printer.ml | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml index 3e09019..d63e5f0 100644 --- a/ocaml/printer.ml +++ b/ocaml/printer.ml @@ -3,6 +3,14 @@ module T = Types.Types let join sep xs = List.fold_left (fun a x -> if a = "" then x else a ^ sep ^ x) "" xs +let meta obj = + match obj with + | T.List { T.meta = meta } -> meta + | T.Map { T.meta = meta } -> meta + | T.Vector { T.meta = meta } -> meta + | T.Symbol { T.meta = meta } -> meta + | _ -> T.Nil + let rec pr_str mal_obj print_readably = let r = print_readably in match mal_obj with -- cgit v1.2.3 From cc916d9d819d17cc47d34321440bf5a2683eac2e Mon Sep 17 00:00:00 2001 From: Chouser Date: Wed, 28 Jan 2015 08:24:52 -0500 Subject: Ocaml: Use builtin String.concat instead of own join fun --- ocaml/printer.ml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml index d63e5f0..8e71376 100644 --- a/ocaml/printer.ml +++ b/ocaml/printer.ml @@ -1,8 +1,5 @@ module T = Types.Types -let join sep xs = - List.fold_left (fun a x -> if a = "" then x else a ^ sep ^ x) "" xs - let meta obj = match obj with | T.List { T.meta = meta } -> meta @@ -25,9 +22,9 @@ let rec pr_str mal_obj print_readably = then "\"" ^ (Str.global_replace (Str.regexp "\\([\"\\]\\)") "\\\\\\1" s) ^ "\"" else s | T.List { T.value = xs } -> - "(" ^ (join " " (List.map (fun s -> pr_str s r) xs)) ^ ")" + "(" ^ (String.concat " " (List.map (fun s -> pr_str s r) xs)) ^ ")" | T.Vector { T.value = xs } -> - "[" ^ (join " " (List.map (fun s -> pr_str s r) xs)) ^ "]" + "[" ^ (String.concat " " (List.map (fun s -> pr_str s r) xs)) ^ "]" | T.Map { T.value = xs } -> (Types.MalMap.fold (fun k v s -> s ^ (if s = "" then "{" else ", ") ^ (pr_str k r) ^ " " ^ (pr_str v r)) xs "") -- cgit v1.2.3 From 16b177329cac77136b236dfb3645e4be4e3df297 Mon Sep 17 00:00:00 2001 From: Chouser Date: Wed, 28 Jan 2015 08:27:32 -0500 Subject: Ocaml: fix string escaping and printing --- ocaml/printer.ml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml index 8e71376..fe025af 100644 --- a/ocaml/printer.ml +++ b/ocaml/printer.ml @@ -19,7 +19,11 @@ let rec pr_str mal_obj print_readably = | T.Bool false -> "false" | T.String s -> if r - then "\"" ^ (Str.global_replace (Str.regexp "\\([\"\\]\\)") "\\\\\\1" s) ^ "\"" + then "\"" ^ (Reader.gsub (Str.regexp "\\([\"\\\n]\\)") + (function + | "\n" -> "\\n" + | x -> "\\" ^ x) + s) ^ "\"" else s | T.List { T.value = xs } -> "(" ^ (String.concat " " (List.map (fun s -> pr_str s r) xs)) ^ ")" -- cgit v1.2.3 From ecd3b6d8e551dd87934142b0323d9b75134bbea9 Mon Sep 17 00:00:00 2001 From: Chouser Date: Thu, 29 Jan 2015 23:29:54 -0500 Subject: OCaml: Add step 9 --- ocaml/printer.ml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'ocaml/printer.ml') diff --git a/ocaml/printer.ml b/ocaml/printer.ml index fe025af..135c3ce 100644 --- a/ocaml/printer.ml +++ b/ocaml/printer.ml @@ -6,6 +6,7 @@ let meta obj = | T.Map { T.meta = meta } -> meta | T.Vector { T.meta = meta } -> meta | T.Symbol { T.meta = meta } -> meta + | T.Fn { T.meta = meta } -> meta | _ -> T.Nil let rec pr_str mal_obj print_readably = @@ -30,7 +31,8 @@ let rec pr_str mal_obj print_readably = | T.Vector { T.value = xs } -> "[" ^ (String.concat " " (List.map (fun s -> pr_str s r) xs)) ^ "]" | T.Map { T.value = xs } -> - (Types.MalMap.fold (fun k v s -> s ^ (if s = "" then "{" else ", ") ^ (pr_str k r) - ^ " " ^ (pr_str v r)) xs "") + "{" ^ (Types.MalMap.fold (fun k v s -> s ^ (if s = "" then "" else ", ") ^ (pr_str k r) + ^ " " ^ (pr_str v r)) xs "") ^ "}" | T.Fn f -> "#" + | T.Atom x -> "(atom " ^ (pr_str !x r) ^ ")" -- cgit v1.2.3