Skip to content

Commit

Permalink
Test for true value is now called is_true_value
Browse files Browse the repository at this point in the history
  • Loading branch information
rvirding committed Sep 14, 2012
1 parent e16d8d6 commit 9c9d3a7
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 49 deletions.
2 changes: 1 addition & 1 deletion src/luerl_basic.erl
Expand Up @@ -68,7 +68,7 @@ table() ->
].

assert(As, St) ->
case luerl_lib:is_true(As) of
case luerl_lib:is_true_value(As) of
true -> {As,St};
false ->
M = case As of
Expand Down
38 changes: 19 additions & 19 deletions src/luerl_eval.erl
Expand Up @@ -48,7 +48,7 @@
-import(luerl_lib, [lua_error/1,badarg_error/2]).

%% -compile(inline). %For when we are optimising
%% -compile({inline,[is_true/1,first_value/1]}).
%% -compile({inline,[is_true_value/1,first_value/1]}).

%%-define(DP(F,As), io:format(F, As)).
-define(DP(F, A), ok).
Expand Down Expand Up @@ -513,7 +513,7 @@ do_while(Exp, Body, St0) ->

while_loop(Exp, Body, St0) ->
{Test,St1} = exp(Exp, St0),
case is_true(Test) of
case is_true_value(Test) of
true ->
St2 = block(Body, St1),
while_loop(Exp, Body, St2);
Expand All @@ -533,7 +533,7 @@ do_repeat(Body, Exp, St0) ->

repeat_loop(Body, St0) ->
{Ret,St1} = with_block(Body, St0),
case is_true(Ret) of
case is_true_value(Ret) of
true -> {[],St1};
false -> repeat_loop(Body, St1)
end.
Expand Down Expand Up @@ -570,7 +570,7 @@ do_if(Tests, Else, St) ->

if_tests([{Exp,Block}|Ts], Else, St0) ->
{Test,St1} = exp(Exp, St0), %What about the environment
case is_true(Test) of
case is_true_value(Test) of
true -> %Test succeeded, do block
block(Block, St1);
false -> %Test failed, try again
Expand Down Expand Up @@ -634,7 +634,7 @@ generic_for(Names, Exps, Block, St) ->

genfor_loop(Names, F, S, Var, Block, St0) ->
{Vals,St1} = functioncall(F, [S,Var], St0),
case is_true(Vals) of
case is_true_value(Vals) of
true -> %We go on
%% Create a local block for each iteration of the loop.
Do = fun (S0) ->
Expand Down Expand Up @@ -703,15 +703,15 @@ exp({table,_,Fs}, St0) ->
%% 'and' and 'or' short-circuit so need special handling.
exp({op,_,'and',L0,R0}, St0) ->
{L1,St1} = exp(L0, St0),
case is_true(L1) of
case is_true_value(L1) of
true ->
{R1,St2} = exp(R0, St1),
{R1,St2}; %Do we need first value?
false -> {L1,St1}
end;
exp({op,_,'or',L0,R0}, St0) ->
{L1,St1} = exp(L0, St0),
case is_true(L1) of
case is_true_value(L1) of
true -> {L1,St1};
false ->
{R1,St2} = exp(R0, St1),
Expand Down Expand Up @@ -959,7 +959,7 @@ numeric_op(_Op, O, E, Raw, St0) ->
true ->
Meta = getmetamethod(O, E, St0),
{Ret,St1} = functioncall(Meta, [O], St0),
{[is_true(Ret)],St1}
{[is_true_value(Ret)],St1}
end.

numeric_op(_Op, O1, O2, E, Raw, St0) ->
Expand All @@ -969,18 +969,18 @@ numeric_op(_Op, O1, O2, E, Raw, St0) ->
true ->
Meta = getmetamethod(O1, O2, E, St0),
{Ret,St1} = functioncall(Meta, [O1,O2], St0),
{[is_true(Ret)],St1}
{[is_true_value(Ret)],St1}
end.

eq_op(_Op, O1, O2, St) when O1 =:= O2 -> {[true],St};
eq_op(_Op, O1, O2, St0) ->
{Ret,St1} = eq_meta(O1, O2, St0),
{[is_true(Ret)],St1}.
{[is_true_value(Ret)],St1}.

neq_op(_Op, O1, O2, St) when O1 =:= O2 -> {[false],St};
neq_op(_Op, O1, O2, St0) ->
{Ret,St1} = eq_meta(O1, O2, St0),
{[not is_true(Ret)],St1}.
{[not is_true_value(Ret)],St1}.

eq_meta(O1, O2, St0) ->
case getmetamethod(O1, <<"__eq">>, St0) of
Expand All @@ -998,20 +998,20 @@ lt_op(_Op, O1, O2, St) when is_binary(O1), is_binary(O2) -> {[O1 < O2],St};
lt_op(_Op, O1, O2, St0) ->
Meta = getmetamethod(O1, O2, <<"__lt">>, St0),
{Ret,St1} = functioncall(Meta, [O1,O2], St0),
{[is_true(Ret)],St1}.
{[is_true_value(Ret)],St1}.

le_op(_Op, O1, O2, St) when is_number(O1), is_number(O2) -> {[O1 =< O2],St};
le_op(_Op, O1, O2, St) when is_binary(O1), is_binary(O2) -> {[O1 =< O2],St};
le_op(_Op, O1, O2, St0) ->
case getmetamethod(O1, O2, <<"__le">>, St0) of
Meta when Meta =/= nil ->
{Ret,St1} = functioncall(Meta, [O1,O2], St0),
{[is_true(Ret)],St1};
{[is_true_value(Ret)],St1};
nil ->
%% Try for not (Op2 < Op1) instead.
Meta = getmetamethod(O1, O2, <<"__lt">>, St0),
{Ret,St1} = functioncall(Meta, [O2,O1], St0),
{[not is_true(Ret)],St1}
{[not is_true_value(Ret)],St1}
end.

%% getmetamethod(Object1, Object2, Event, State) -> Metod | nil.
Expand Down Expand Up @@ -1043,12 +1043,12 @@ getmetamethod_tab(#tref{i=M}, E, Ts) ->
end;
getmetamethod_tab(_, _, _) -> nil. %Other types have no metatables

%% is_true(Rets) -> boolean().
%% is_true_value(Rets) -> boolean().

is_true([nil|_]) -> false;
is_true([false|_]) -> false;
is_true([_|_]) -> true;
is_true([]) -> false.
is_true_value([nil|_]) -> false;
is_true_value([false|_]) -> false;
is_true_value([_|_]) -> true;
is_true_value([]) -> false.

%% first_value(Rets) -> Value.

Expand Down
12 changes: 6 additions & 6 deletions src/luerl_lib.erl
Expand Up @@ -36,7 +36,7 @@
-include("luerl.hrl").

-export([lua_error/1,badarg_error/2,format_error/1,
is_true/1,first_value/1,number_to_list/1,
is_true_value/1,first_value/1,number_to_list/1,
to_list/1,to_lists/1,to_lists/2,to_int/1,to_ints/1,to_ints/2,
tonumber/1,tonumber/2,tonumbers/1,tonumbers/2,tointeger/1,
tointegers/1,tointegers/2,tostring/1,tostrings/1,tostrings/2,
Expand Down Expand Up @@ -137,13 +137,13 @@ format_error({illegal_op,Op}) ->
format_error({undefined_op,Op}) ->
io_lib:format("undefined op: ~w", [Op]).

%% is_true(Rets) -> boolean()>
%% is_true_value(Rets) -> boolean()>
%% first_value(Rets) -> Value | nil.

is_true([nil|_]) -> false;
is_true([false|_]) -> false;
is_true([_|_]) -> true;
is_true([]) -> false.
is_true_value([nil|_]) -> false;
is_true_value([false|_]) -> false;
is_true_value([_|_]) -> true;
is_true_value([]) -> false.

first_value([V|_]) -> V;
first_value([]) -> nil.
Expand Down
39 changes: 16 additions & 23 deletions src/luerl_table.erl
Expand Up @@ -324,7 +324,7 @@ lt_comp(O1, O2, St0) ->
nil -> lua_error({illegal_comp,sort});
Meta ->
{Ret,St1} = luerl_eval:functioncall(Meta, [O1,O2], St0),
{[is_true(Ret)],St1}
{[luerl_lib:is_true_value(Ret)],St1}
end.

renumber(Tab0) ->
Expand Down Expand Up @@ -358,13 +358,6 @@ length_loop(I, Arr) ->
_ -> length_loop(I+1, Arr)
end.

%% is_true(Rets) -> boolean().

is_true([nil|_]) -> false;
is_true([false|_]) -> false;
is_true([_|_]) -> true;
is_true([]) -> false.

%% sort(A,B,C) -> sort_up(A,B,C).

%% sort_up(A,B,[X,Y|L]) ->
Expand Down Expand Up @@ -419,7 +412,7 @@ merge_sort(_, St, []) -> {[],St};
merge_sort(_, St, [_] = L) -> {L,St};
merge_sort(Fun, St0, [X, Y|T]) ->
{Ret,St1} = Fun([X,Y], St0),
case is_true(Ret) of
case luerl_lib:is_true_value(Ret) of
true ->
fsplit_1(Y, X, Fun, St1, T, [], []);
false ->
Expand All @@ -429,12 +422,12 @@ merge_sort(Fun, St0, [X, Y|T]) ->
%% Ascending.
fsplit_1(Y, X, Fun, St0, [Z|L], R, Rs) ->
{Ret1,St1} = Fun([Y,Z], St0),
case is_true(Ret1) of
case luerl_lib:is_true_value(Ret1) of
true ->
fsplit_1(Z, Y, Fun, St1, L, [X|R], Rs);
false ->
{Ret2,St2} = Fun([X,Z], St1),
case is_true(Ret2) of
case luerl_lib:is_true_value(Ret2) of
true ->
fsplit_1(Y, Z, Fun, St2, L, [X|R], Rs);
false when R == [] ->
Expand All @@ -448,17 +441,17 @@ fsplit_1(Y, X, Fun, St, [], R, Rs) ->

fsplit_1_1(Y, X, Fun, St0, [Z|L], R, Rs, S) ->
{Ret1,St1} = Fun([Y,Z], St0),
case is_true(Ret1) of
case luerl_lib:is_true_value(Ret1) of
true ->
fsplit_1_1(Z, Y, Fun, St1, L, [X|R], Rs, S);
false ->
{Ret2,St2} = Fun([X,Z], St1),
case is_true(Ret2) of
case luerl_lib:is_true_value(Ret2) of
true ->
fsplit_1_1(Y, Z, Fun, St2, L, [X|R], Rs, S);
false ->
{Ret3,St3} = Fun([S,Z], St2),
case is_true(Ret3) of
case luerl_lib:is_true_value(Ret3) of
true ->
fsplit_1(Z, S, Fun, St3, L, [], [[Y, X|R]|Rs]);
false ->
Expand All @@ -472,12 +465,12 @@ fsplit_1_1(Y, X, Fun, St, [], R, Rs, S) ->
%% Descending.
fsplit_2(Y, X, Fun, St0, [Z|L], R, Rs) ->
{Ret1,St1} = Fun([Y,Z], St0),
case is_true(Ret1) of
case luerl_lib:is_true_value(Ret1) of
false ->
fsplit_2(Z, Y, Fun, St1, L, [X|R], Rs);
true ->
{Ret2,St2} = Fun([X,Z], St1),
case is_true(Ret2) of
case luerl_lib:is_true_value(Ret2) of
false ->
fsplit_2(Y, Z, Fun, St2, L, [X|R], Rs);
true when R == [] ->
Expand All @@ -491,17 +484,17 @@ fsplit_2(Y, X, Fun, St, [], R, Rs) ->

fsplit_2_1(Y, X, Fun, St0, [Z|L], R, Rs, S) ->
{Ret1,St1} = Fun([Y,Z], St0),
case is_true(Ret1) of
case luerl_lib:is_true_value(Ret1) of
false ->
fsplit_2_1(Z, Y, Fun, St1, L, [X|R], Rs, S);
true ->
{Ret2,St2} = Fun([X,Z], St1),
case is_true(Ret2) of
case luerl_lib:is_true_value(Ret2) of
false ->
fsplit_2_1(Y, Z, Fun, St2, L, [X|R], Rs, S);
true ->
{Ret3,St3} = Fun([S,Z], St2),
case is_true(Ret3) of
case luerl_lib:is_true_value(Ret3) of
false ->
fsplit_2(Z, S, Fun, St3, L, [], [[Y, X|R]|Rs]);
true ->
Expand Down Expand Up @@ -543,7 +536,7 @@ rfmergel([], Acc, Fun, St, O) ->
%% Elements from the first list are prioritized.
fmerge2_1([H1|T1], H2, Fun, St0, T2, M) ->
{Ret,St1} = Fun([H1,H2], St0),
case is_true(Ret) of
case luerl_lib:is_true_value(Ret) of
true ->
fmerge2_1(T1, H2, Fun, St1, T2, [H1|M]);
false ->
Expand All @@ -554,7 +547,7 @@ fmerge2_1([], H2, _Fun, St, T2, M) ->

fmerge2_2(H1, T1, Fun, St0, [H2|T2], M) ->
{Ret,St1} = Fun([H1,H2], St0),
case is_true(Ret) of
case luerl_lib:is_true_value(Ret) of
true ->
fmerge2_1(T1, H2, Fun, St1, T2, [H1|M]);
false ->
Expand All @@ -570,7 +563,7 @@ fmerge2_2(H1, T1, _Fun, St, [], M) ->

rfmerge2_1([H1|T1], H2, Fun, St0, T2, M) ->
{Ret,St1} = Fun([H1,H2], St0),
case is_true(Ret) of
case luerl_lib:is_true_value(Ret) of
true ->
rfmerge2_2(H1, T1, Fun, St1, T2, [H2|M]);
false ->
Expand All @@ -581,7 +574,7 @@ rfmerge2_1([], H2, _Fun, St, T2, M) ->

rfmerge2_2(H1, T1, Fun, St0, [H2|T2], M) ->
{Ret,St1} = Fun([H1,H2], St0),
case is_true(Ret) of
case luerl_lib:is_true_value(Ret) of
true ->
rfmerge2_2(H1, T1, Fun, St1, T2, [H2|M]);
false ->
Expand Down

0 comments on commit 9c9d3a7

Please sign in to comment.