diff options
| author | Rose Hogenson <rhogenson@posteo.net> | 2023-02-12 15:37:25 -0800 |
|---|---|---|
| committer | Rose Hogenson <rhogenson@posteo.net> | 2023-02-12 15:37:25 -0800 |
| commit | d940187fd8720e0ab3c00e5a6a7ae8f181c7752d (patch) | |
| tree | 69df829ae1e7fb9454008920b49db08489d939a6 /elab.sml | |
| parent | 5989629a7951e544ad4656672025a99ecd08c7c9 (diff) | |
| download | sml-d940187fd8720e0ab3c00e5a6a7ae8f181c7752d.tar.zst | |
Add lambda functions.
Diffstat (limited to 'elab.sml')
| -rw-r--r-- | elab.sml | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -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 |
