Remove 'if' from fcode
This commit is contained in:
parent
46c538b7bf
commit
ff58ec0cba
@ -32,7 +32,6 @@
|
|||||||
| {var, var_name()}
|
| {var, var_name()}
|
||||||
| {tuple, [fexpr()]}
|
| {tuple, [fexpr()]}
|
||||||
| {binop, ftype(), binop(), fexpr(), fexpr()}
|
| {binop, ftype(), binop(), fexpr(), fexpr()}
|
||||||
| {'if', fexpr(), fexpr(), fexpr()}
|
|
||||||
| {'let', var_name(), fexpr(), fexpr()}
|
| {'let', var_name(), fexpr(), fexpr()}
|
||||||
| {switch, fsplit()}.
|
| {switch, fsplit()}.
|
||||||
|
|
||||||
@ -151,6 +150,7 @@ decl_to_fcode(Env = #{ functions := Funs }, {letfun, Ann, {id, _, Name}, Args, R
|
|||||||
FName = lookup_fun(Env, qname(Env, Name)),
|
FName = lookup_fun(Env, qname(Env, Name)),
|
||||||
FArgs = args_to_fcode(Env, Args),
|
FArgs = args_to_fcode(Env, Args),
|
||||||
FBody = expr_to_fcode(Env, Body),
|
FBody = expr_to_fcode(Env, Body),
|
||||||
|
%% io:format("Body of ~s\n~s\n", [Name, format_fexpr(FBody)]),
|
||||||
Def = #{ attrs => Attrs,
|
Def = #{ attrs => Attrs,
|
||||||
args => FArgs,
|
args => FArgs,
|
||||||
return => type_to_fcode(Env, Ret),
|
return => type_to_fcode(Env, Ret),
|
||||||
@ -198,9 +198,17 @@ expr_to_fcode(Env, Type, {list, _, Es}) ->
|
|||||||
|
|
||||||
%% Conditionals
|
%% Conditionals
|
||||||
expr_to_fcode(Env, _Type, {'if', _, Cond, Then, Else}) ->
|
expr_to_fcode(Env, _Type, {'if', _, Cond, Then, Else}) ->
|
||||||
{'if', expr_to_fcode(Env, Cond),
|
Switch = fun(X) ->
|
||||||
expr_to_fcode(Env, Then),
|
{switch, {split, boolean, X,
|
||||||
expr_to_fcode(Env, Else)};
|
[{'case', {bool, false}, {nosplit, expr_to_fcode(Env, Else)}},
|
||||||
|
{'case', {bool, true}, {nosplit, expr_to_fcode(Env, Then)}}]}}
|
||||||
|
end,
|
||||||
|
case Cond of
|
||||||
|
{var, X} -> Switch(X);
|
||||||
|
_ ->
|
||||||
|
X = fresh_name(),
|
||||||
|
{'let', X, expr_to_fcode(Env, Cond), Switch(X)}
|
||||||
|
end;
|
||||||
|
|
||||||
%% Switch
|
%% Switch
|
||||||
expr_to_fcode(Env, _, {switch, _, Expr = {typed, _, E, Type}, Alts}) ->
|
expr_to_fcode(Env, _, {switch, _, Expr = {typed, _, E, Type}, Alts}) ->
|
||||||
@ -326,7 +334,6 @@ rename(Ren, Expr) ->
|
|||||||
{var, X} -> {var, rename_var(Ren, X)};
|
{var, X} -> {var, rename_var(Ren, X)};
|
||||||
{tuple, Es} -> {tuple, [rename(Ren, E) || E <- Es]};
|
{tuple, Es} -> {tuple, [rename(Ren, E) || E <- Es]};
|
||||||
{binop, T, Op, E1, E2} -> {binop, T, Op, rename(Ren, E1), rename(Ren, E2)};
|
{binop, T, Op, E1, E2} -> {binop, T, Op, rename(Ren, E1), rename(Ren, E2)};
|
||||||
{'if', A, B, C} -> {'if', rename(Ren, A), rename(Ren, B), rename(Ren, C)};
|
|
||||||
{'let', X, E, Body} ->
|
{'let', X, E, Body} ->
|
||||||
{Z, Ren1} = rename_binding(Ren, X),
|
{Z, Ren1} = rename_binding(Ren, X),
|
||||||
{'let', Z, rename(Ren, E), rename(Ren1, Body)};
|
{'let', Z, rename(Ren, E), rename(Ren1, Body)};
|
||||||
@ -538,10 +545,6 @@ pp_fexpr({tuple, Es}) ->
|
|||||||
pp_parens(prettypr:par(pp_punctuate(pp_text(","), [pp_fexpr(E) || E <- Es])));
|
pp_parens(prettypr:par(pp_punctuate(pp_text(","), [pp_fexpr(E) || E <- Es])));
|
||||||
pp_fexpr({binop, _Type, Op, A, B}) ->
|
pp_fexpr({binop, _Type, Op, A, B}) ->
|
||||||
pp_parens(prettypr:par([pp_fexpr(A), pp_text(Op), pp_fexpr(B)]));
|
pp_parens(prettypr:par([pp_fexpr(A), pp_text(Op), pp_fexpr(B)]));
|
||||||
pp_fexpr({'if', A, B, C}) ->
|
|
||||||
prettypr:par([pp_beside(pp_text("if "), pp_fexpr(A)),
|
|
||||||
prettypr:nest(2, pp_beside(pp_text("then "), pp_fexpr(B))),
|
|
||||||
prettypr:nest(2, pp_beside(pp_text("else "), pp_fexpr(C)))]);
|
|
||||||
pp_fexpr({'let', X, A, B}) ->
|
pp_fexpr({'let', X, A, B}) ->
|
||||||
prettypr:par([pp_beside([pp_text("let "), pp_text(X), pp_text(" = "), pp_fexpr(A), pp_text(" in")]),
|
prettypr:par([pp_beside([pp_text("let "), pp_text(X), pp_text(" = "), pp_fexpr(A), pp_text(" in")]),
|
||||||
pp_fexpr(B)]);
|
pp_fexpr(B)]);
|
||||||
|
@ -150,10 +150,6 @@ to_scode(Env, {binop, _Type, Op, A, B}) ->
|
|||||||
to_scode(Env, A),
|
to_scode(Env, A),
|
||||||
binop_to_scode(Op) ];
|
binop_to_scode(Op) ];
|
||||||
|
|
||||||
to_scode(Env, {'if', Dec, Then, Else}) ->
|
|
||||||
[ to_scode(notail(Env), Dec),
|
|
||||||
{switch, boolean, [to_scode(Env, Else), to_scode(Env, Then)], missing} ];
|
|
||||||
|
|
||||||
to_scode(Env, {'let', X, {var, Y}, Body}) ->
|
to_scode(Env, {'let', X, {var, Y}, Body}) ->
|
||||||
Env1 = bind_var(X, lookup_var(Env, Y), Env),
|
Env1 = bind_var(X, lookup_var(Env, Y), Env),
|
||||||
to_scode(Env1, Body);
|
to_scode(Env1, Body);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user