Tag for literals in fcode to make code cleaner
This commit is contained in:
parent
182f30133b
commit
8233c780e4
@ -33,13 +33,15 @@
|
||||
string_concat | bits_set | bits_clear | bits_test | bits_sum |
|
||||
bits_intersection | bits_union | bits_difference.
|
||||
|
||||
-type fexpr() :: {int, integer()}
|
||||
-type flit() :: {int, integer()}
|
||||
| {string, binary()}
|
||||
| {account_pubkey, binary()}
|
||||
| {contract_pubkey, binary()}
|
||||
| {oracle_pubkey, binary()}
|
||||
| {oracle_query_id, binary()}
|
||||
| {bool, false | true}
|
||||
| {bool, false | true}.
|
||||
|
||||
-type fexpr() :: {lit, flit()}
|
||||
| nil
|
||||
| {var, var_name()}
|
||||
| {def, fun_name(), [fexpr()]}
|
||||
@ -336,16 +338,16 @@ expr_to_fcode(Env, Expr) ->
|
||||
-spec expr_to_fcode(env(), aeso_syntax:type() | no_type, aeso_syntax:expr()) -> fexpr().
|
||||
|
||||
%% Literals
|
||||
expr_to_fcode(_Env, _Type, {int, _, N}) -> {int, N};
|
||||
expr_to_fcode(_Env, _Type, {char, _, N}) -> {int, N};
|
||||
expr_to_fcode(_Env, _Type, {bool, _, B}) -> {bool, B};
|
||||
expr_to_fcode(_Env, _Type, {string, _, S}) -> {string, S};
|
||||
expr_to_fcode(_Env, _Type, {account_pubkey, _, K}) -> {account_pubkey, K};
|
||||
expr_to_fcode(_Env, _Type, {contract_pubkey, _, K}) -> {contract_pubkey, K};
|
||||
expr_to_fcode(_Env, _Type, {oracle_pubkey, _, K}) -> {oracle_pubkey, K};
|
||||
expr_to_fcode(_Env, _Type, {oracle_query_id, _, K}) -> {oracle_query_id, K};
|
||||
expr_to_fcode(_Env, _Type, {int, _, N}) -> {lit, {int, N}};
|
||||
expr_to_fcode(_Env, _Type, {char, _, N}) -> {lit, {int, N}};
|
||||
expr_to_fcode(_Env, _Type, {bool, _, B}) -> {lit, {bool, B}};
|
||||
expr_to_fcode(_Env, _Type, {string, _, S}) -> {lit, {string, S}};
|
||||
expr_to_fcode(_Env, _Type, {account_pubkey, _, K}) -> {lit, {account_pubkey, K}};
|
||||
expr_to_fcode(_Env, _Type, {contract_pubkey, _, K}) -> {lit, {contract_pubkey, K}};
|
||||
expr_to_fcode(_Env, _Type, {oracle_pubkey, _, K}) -> {lit, {oracle_pubkey, K}};
|
||||
expr_to_fcode(_Env, _Type, {oracle_query_id, _, K}) -> {lit, {oracle_query_id, K}};
|
||||
|
||||
expr_to_fcode(_Env, _Type, {bytes, _, Bin}) -> {string, Bin};
|
||||
expr_to_fcode(_Env, _Type, {bytes, _, Bin}) -> {lit, {string, Bin}};
|
||||
|
||||
%% Variables
|
||||
expr_to_fcode(Env, _Type, {id, _, X}) -> resolve_var(Env, [X]);
|
||||
@ -449,7 +451,7 @@ expr_to_fcode(Env, _Type, {app, _Ann, {Op, _}, [A, B]}) when is_atom(Op) ->
|
||||
{op, Op, [expr_to_fcode(Env, A), expr_to_fcode(Env, B)]};
|
||||
expr_to_fcode(Env, _Type, {app, _Ann, {Op, _}, [A]}) when is_atom(Op) ->
|
||||
case Op of
|
||||
'-' -> {op, '-', [{int, 0}, expr_to_fcode(Env, A)]};
|
||||
'-' -> {op, '-', [{lit, {int, 0}}, expr_to_fcode(Env, A)]};
|
||||
'!' -> {op, '!', [expr_to_fcode(Env, A)]}
|
||||
end;
|
||||
|
||||
@ -704,8 +706,8 @@ expr_to_decision_tree(Env, {typed, _, Expr, _}) -> expr_to_decision_tree(Env, Ex
|
||||
expr_to_decision_tree(Env, Expr) ->
|
||||
{atom, expr_to_fcode(Env, Expr)}.
|
||||
|
||||
decision_tree_to_fcode(false) -> {bool, false};
|
||||
decision_tree_to_fcode(true) -> {bool, true};
|
||||
decision_tree_to_fcode(false) -> {lit, {bool, false}};
|
||||
decision_tree_to_fcode(true) -> {lit, {bool, true}};
|
||||
decision_tree_to_fcode({atom, B}) -> B;
|
||||
decision_tree_to_fcode({'if', A, Then, Else}) ->
|
||||
X = fresh_name(),
|
||||
@ -806,13 +808,7 @@ lambda_lift_expr({remote_u, Ct, F, Ar}) ->
|
||||
make_closure(FVs, Xs, {remote, Ct1, F, Args});
|
||||
lambda_lift_expr(Expr) ->
|
||||
case Expr of
|
||||
{int, _} -> Expr;
|
||||
{string, _} -> Expr;
|
||||
{account_pubkey, _} -> Expr;
|
||||
{contract_pubkey, _} -> Expr;
|
||||
{oracle_pubkey, _} -> Expr;
|
||||
{oracle_query_id, _} -> Expr;
|
||||
{bool, _} -> Expr;
|
||||
{lit, _} -> Expr;
|
||||
nil -> Expr;
|
||||
{var, _} -> Expr;
|
||||
{closure, _, _} -> Expr;
|
||||
@ -987,13 +983,7 @@ free_vars(Xs) when is_list(Xs) ->
|
||||
free_vars(Expr) ->
|
||||
case Expr of
|
||||
{var, X} -> [X];
|
||||
{int, _} -> [];
|
||||
{string, _} -> [];
|
||||
{account_pubkey, _} -> [];
|
||||
{contract_pubkey, _} -> [];
|
||||
{oracle_pubkey, _} -> [];
|
||||
{oracle_query_id, _} -> [];
|
||||
{bool, _} -> [];
|
||||
{lit, _} -> [];
|
||||
nil -> [];
|
||||
{def, _, As} -> free_vars(As);
|
||||
{def_u, _, _} -> [];
|
||||
@ -1034,13 +1024,7 @@ get_named_arg({named_arg_t, _, {id, _, Name}, _, Default}, Args) ->
|
||||
-spec rename([{var_name(), var_name()}], fexpr()) -> fexpr().
|
||||
rename(Ren, Expr) ->
|
||||
case Expr of
|
||||
{int, _} -> Expr;
|
||||
{string, _} -> Expr;
|
||||
{account_pubkey, _} -> Expr;
|
||||
{contract_pubkey, _} -> Expr;
|
||||
{oracle_pubkey, _} -> Expr;
|
||||
{oracle_query_id, _} -> Expr;
|
||||
{bool, _} -> Expr;
|
||||
{lit, _} -> Expr;
|
||||
nil -> nil;
|
||||
{var, X} -> {var, rename_var(Ren, X)};
|
||||
{def, D, Es} -> {def, D, [rename(Ren, E) || E <- Es]};
|
||||
@ -1207,13 +1191,7 @@ pp_punctuate(Sep, [X | Xs]) -> [pp_beside(X, Sep) | pp_punctuate(Sep, Xs)].
|
||||
|
||||
pp_par([]) -> prettypr:empty();
|
||||
pp_par(Xs) -> prettypr:par(Xs).
|
||||
pp_fexpr({Tag, Lit}) when Tag == int;
|
||||
Tag == string;
|
||||
Tag == bool;
|
||||
Tag == account_pubkey;
|
||||
Tag == contract_pubkey;
|
||||
Tag == oracle_pubkey;
|
||||
Tag == oracle_query_id ->
|
||||
pp_fexpr({lit, {Tag, Lit}}) ->
|
||||
aeso_pretty:expr({Tag, [], Lit});
|
||||
pp_fexpr(nil) ->
|
||||
pp_text("[]");
|
||||
@ -1304,6 +1282,8 @@ pp_pat({tuple, Xs}) -> pp_fexpr({tuple, [{var, X} || X <- Xs]});
|
||||
pp_pat({'::', X, Xs}) -> pp_fexpr({op, '::', [{var, X}, {var, Xs}]});
|
||||
pp_pat({con, As, I, Xs}) -> pp_fexpr({con, As, I, [{var, X} || X <- Xs]});
|
||||
pp_pat({var, X}) -> pp_fexpr({var, X});
|
||||
pp_pat(P = {Tag, _}) when Tag == bool; Tag == int; Tag == string
|
||||
-> pp_fexpr({lit, P});
|
||||
pp_pat(Pat) -> pp_fexpr(Pat).
|
||||
|
||||
is_infix(Op) ->
|
||||
|
@ -177,27 +177,16 @@ lookup_var(#env{vars = Vars}, X) ->
|
||||
|
||||
%% -- The compiler --
|
||||
|
||||
to_scode(_Env, {int, N}) ->
|
||||
[push(?i(N))];
|
||||
|
||||
to_scode(_Env, {string, S}) ->
|
||||
[push(?i(aeb_fate_data:make_string(S)))];
|
||||
|
||||
to_scode(_Env, {bool, B}) ->
|
||||
[push(?i(B))];
|
||||
|
||||
to_scode(_Env, {account_pubkey, K}) ->
|
||||
[push(?i(aeb_fate_data:make_address(K)))];
|
||||
|
||||
to_scode(_Env, {contract_pubkey, K}) ->
|
||||
[push(?i(aeb_fate_data:make_address(K)))];
|
||||
|
||||
to_scode(_Env, {oracle_pubkey, K}) ->
|
||||
[push(?i(aeb_fate_data:make_oracle(K)))];
|
||||
|
||||
to_scode(_Env, {oracle_query_id, K}) ->
|
||||
%% Not actually in FATE yet
|
||||
[push(?i(aeb_fate_data:make_oracle_query(K)))];
|
||||
to_scode(_Env, {lit, L}) ->
|
||||
case L of
|
||||
{int, N} -> [push(?i(N))];
|
||||
{string, S} -> [push(?i(aeb_fate_data:make_string(S)))];
|
||||
{bool, B} -> [push(?i(B))];
|
||||
{account_pubkey, K} -> [push(?i(aeb_fate_data:make_address(K)))];
|
||||
{contract_pubkey, K} -> [push(?i(aeb_fate_data:make_address(K)))];
|
||||
{oracle_pubkey, K} -> [push(?i(aeb_fate_data:make_oracle(K)))];
|
||||
{oracle_query_id, K} -> [push(?i(aeb_fate_data:make_oracle_query(K)))] %% TODO: Not actually in FATE yet
|
||||
end;
|
||||
|
||||
to_scode(_Env, nil) ->
|
||||
[aeb_fate_code:nil(?a)];
|
||||
@ -254,7 +243,7 @@ to_scode(Env, {remote, Ct, Fun, [_Gas, _Value | Args]}) ->
|
||||
call_to_scode(Env, [to_scode(Env, Ct), Call], Args);
|
||||
|
||||
to_scode(Env, {closure, Fun, FVs}) ->
|
||||
to_scode(Env, {tuple, [{string, make_function_name(Fun)}, FVs]});
|
||||
to_scode(Env, {tuple, [{lit, {string, make_function_name(Fun)}}, FVs]});
|
||||
|
||||
to_scode(Env, {switch, Case}) ->
|
||||
split_to_scode(Env, Case);
|
||||
|
Loading…
x
Reference in New Issue
Block a user