summaryrefslogtreecommitdiffstats
path: root/elab.sml
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2023-02-12 15:37:25 -0800
committerRose Hogenson <rhogenson@posteo.net>2023-02-12 15:37:25 -0800
commitd940187fd8720e0ab3c00e5a6a7ae8f181c7752d (patch)
tree69df829ae1e7fb9454008920b49db08489d939a6 /elab.sml
parent5989629a7951e544ad4656672025a99ecd08c7c9 (diff)
downloadsml-d940187fd8720e0ab3c00e5a6a7ae8f181c7752d.tar.zst
Add lambda functions.
Diffstat (limited to 'elab.sml')
-rw-r--r--elab.sml15
1 files changed, 12 insertions, 3 deletions
diff --git a/elab.sml b/elab.sml
index 0838f38..6a80715 100644
--- a/elab.sml
+++ b/elab.sml
@@ -7,16 +7,25 @@ struct
fun elaborate (p : Syntax.expr) : Syntax.lexp =
case p of
- Syntax.EBuiltin builtin => Syntax.LPrim (primop builtin)
- | Syntax.EIdent [i] => raise Fail "only primitive operations for now, no variables"
+ Syntax.EIdent [i] => raise Fail "only primitive operations for now, no variables"
+ | Syntax.EIdent _ => raise Fail "long identifiers are not supported"
+ | Syntax.EBuiltin builtin => Syntax.LPrim (primop builtin)
| Syntax.EInt i => Syntax.LInt i
| Syntax.EStr s => Syntax.LString s
| Syntax.ETuple exprs => Syntax.LRecord (map elaborate exprs)
+ | Syntax.EList exprs =>
+ foldr
+ (fn (x, acc) =>
+ Syntax.LRecord [elaborate x, acc])
+ (Syntax.LInt 0)
+ exprs
| Syntax.EApp (f, x) => Syntax.LApp (elaborate f, elaborate x)
| Syntax.ETyped (e, _) => elaborate e
+ | Syntax.EAndAlso (_, _) => raise Fail "unimplemented"
+ | Syntax.EOrElse (_, _) => raise Fail "unimplemented"
| Syntax.ELet (decls, body) =>
Syntax.LRecord
(map elaborate
(map (fn (Syntax.DVal e) => e) decls @ [body]))
- | _ => raise Fail "elaborate: operation not supported"
+ | Syntax.ELambda e => Syntax.LFn (Gensym.new (), elaborate e)
end