Add loop operator in fcode #889

Open
zxq9 wants to merge 27 commits from loop-op into master
Showing only changes of commit 7277a968f8 - Show all commits

View File

@ -662,22 +662,21 @@ expr_to_fcode(Env, _Type, {app, _, {'..', _}, [A, B]}) ->
)}, )},
Loop; Loop;
expr_to_fcode(Env, _Type, {app, _, {'..', _}, [A, B]}) -> expr_to_fcode(Env, _Type, {app, _, {'..', _}, [A, B]}) ->
AV = fresh_name(), BV = fresh_name(), % var to keep B
BV = fresh_name(),
WithA = fun(X) -> {'let', AV, expr_to_fcode(Env, A), X} end,
WithB = fun(X) -> {'let', BV, expr_to_fcode(Env, B), X} end, WithB = fun(X) -> {'let', BV, expr_to_fcode(Env, B), X} end,
St = fresh_name(), St = fresh_name(), % loop state
It = fresh_name(), ItProj = {proj, {var, St}, 1},
Init = {tuple, [nil, {var, AV}]}, AcProj = {proj, {var, St}, 0},
WithA(WithB( Init = {tuple, [nil, expr_to_fcode(Env, A)]},
{loop, Init, St, Loop = {loop, Init, St,
{'let', It, {proj, {var, St}, 1}, make_if(
make_if({op, '=<', [{var, It}, {var, BV}]}, {op, '=<', [ItProj, {var, BV}]},
{continue, {tuple, [{op, '::', [{var, It}, {proj, {var, St}, 0}]}, {continue, {tuple, [{op, '::', [ItProj, AcProj]},
{op, '+', [{var, It}, {lit, {int, 1}}]} {op, '+', [ItProj, {lit, {int, 1}}]}
]}}, ]}},
{break, {proj, {var, St}, 0}} {break, AcProj}
)}})); )},
WithB(Loop);
expr_to_fcode(Env, _Type, {list_comp, _, Yield, []}) -> expr_to_fcode(Env, _Type, {list_comp, _, Yield, []}) ->
{op, '::', [expr_to_fcode(Env, Yield), nil]}; {op, '::', [expr_to_fcode(Env, Yield), nil]};
expr_to_fcode(Env, _Type, {list_comp, As, Yield, [{comprehension_bind, Pat = {typed, _, _, PatType}, BindExpr}|Rest]}) -> expr_to_fcode(Env, _Type, {list_comp, As, Yield, [{comprehension_bind, Pat = {typed, _, _, PatType}, BindExpr}|Rest]}) ->