Branch
Hash :
b680684f
Author :
Thomas de Grivel
Date :
2022-02-17T11:36:40
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
-module(pure).
-export([is_pattern_expr/1]).
-import(lists, [all/2]).
is_pattern_expr(Expr) ->
case is_pattern_expr_1(Expr) of
false -> false;
true ->
%% Expression is syntactically correct - make sure that it
%% also can be evaluated.
case erl_eval:partial_eval(Expr) of
{integer,_,_} -> true;
{char,_,_} -> true;
{float,_,_} -> true;
{atom,_,_} -> true;
{var,_,_} -> true;
{tuple,_,_} -> true;
X -> io:write(X), false
end
end.
is_pattern_expr_1({char,_Anno,_C}) -> true;
is_pattern_expr_1({integer,_Anno,_I}) -> true;
is_pattern_expr_1({float,_Anno,_F}) -> true;
is_pattern_expr_1({atom,_Anno,_A}) -> true;
is_pattern_expr_1({tuple,_Anno,Es}) ->
all(fun is_pattern_expr/1, Es);
is_pattern_expr_1({var,_Anno,_V}) -> true;
is_pattern_expr_1({nil,_Anno}) -> true;
is_pattern_expr_1({cons,_Anno,H,T}) ->
is_pattern_expr_1(H) andalso is_pattern_expr_1(T);
is_pattern_expr_1({op,_Anno,Op,A}) ->
erl_internal:arith_op(Op, 1) andalso is_pattern_expr_1(A);
is_pattern_expr_1({op,_Anno,Op,A1,A2}) ->
erl_internal:arith_op(Op, 2) andalso all(fun is_pattern_expr/1, [A1,A2]);
is_pattern_expr_1(_Other) -> false.