diff options
author | Nathan Ringo <nathan@remexre.com> | 2024-01-20 00:00:17 -0600 |
---|---|---|
committer | Nathan Ringo <nathan@remexre.com> | 2024-01-20 00:00:17 -0600 |
commit | 514896e05424d9df97295840b3fa6f2ad46620ab (patch) | |
tree | f69abbb4971a3bf9cc4ca3152b8f6cc141069cc8 /discocaml/ast.ml | |
parent | 738f437f59bf2408dcdc6514ffa2d7a2ee5a61c5 (diff) |
Adds lists, although they don't evaluate yet.
Diffstat (limited to 'discocaml/ast.ml')
-rw-r--r-- | discocaml/ast.ml | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/discocaml/ast.ml b/discocaml/ast.ml index 3ba3f63..f3606cf 100644 --- a/discocaml/ast.ml +++ b/discocaml/ast.ml @@ -20,8 +20,10 @@ type 'a prim = and expr = | App of expr index * expr index + | Cons of expr index * expr index | Int of int | Lam of string * expr index + | Nil | Prim : 'a prim * 'a -> expr | Var of string @@ -70,6 +72,11 @@ let add_expr_to_ast (ast : 'a ast) : Parsetree.expression -> expr index = | _ -> raise_unsupported_expr expr) (loop f) xs | Pexp_constant (Pconst_integer (n, None)) -> add (Int (int_of_string n)) + | Pexp_construct + ({ txt = Lident "::"; _ }, Some { pexp_desc = Pexp_tuple [ hd; tl ]; _ }) + -> + add (Cons (loop hd, loop tl)) + | Pexp_construct ({ txt = Lident "[]"; _ }, None) -> add Nil | Pexp_fun (Nolabel, None, arg_pat, body) -> ( match arg_pat.ppat_desc with | Ppat_var { txt = name; _ } -> add (Lam (name, loop body)) @@ -131,6 +138,13 @@ let parsetree_of_subexpr (ast : 'a ast) : expr -> Parsetree.expression = let f, xs = list_of_apps expr in let xs = List.map (fun x -> (Asttypes.Nolabel, loop (subexpr x))) xs in Wrap.expression (Pexp_apply (loop f, xs)) + | Cons (hd, tl) -> + Wrap.expression + (Pexp_construct + ( Wrap.ident "::", + Some + (Wrap.expression + (Pexp_tuple [ loop (subexpr hd); loop (subexpr tl) ])) )) | Int n -> Wrap.expression (Pexp_constant (Pconst_integer (Int.to_string n, None))) | Lam (x, b) -> @@ -140,6 +154,7 @@ let parsetree_of_subexpr (ast : 'a ast) : expr -> Parsetree.expression = None, Wrap.pattern (Ppat_var (Wrap.var x)), loop (subexpr b) )) + | Nil -> Wrap.expression (Pexp_construct (Wrap.ident "[]", None)) | Prim (Add, (l, r)) -> Wrap.expression (Pexp_apply |