aboutsummaryrefslogtreecommitdiff
path: root/discocaml/ast.ml
diff options
context:
space:
mode:
Diffstat (limited to 'discocaml/ast.ml')
-rw-r--r--discocaml/ast.ml15
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