| Paste number 51674: | my pare equivalent |
| Pasted by: | mrd` |
| When: | 1 year, 7 months ago |
| Share: | Tweet this! | http://paste.lisp.org/+13VE |
| Channel: | #erlang |
| Paste contents: |
-module(pareval).
-author(matthew@mochimedia.com).
-export([parse_transform/2]).
-export([pareval/1]).
parse_transform(Forms, _Options) ->
[expr(Form) || Form <- Forms].
pareval(Funs) ->
Self = self(),
Pids = [spawn_link(fun() -> Self ! {pareval, self(), Fun()} end) || Fun <- Funs],
[receive {pareval, Pid, Val} -> Val end || Pid <- Pids].
expr({call,_,{atom,_,pareval},Args}) ->
{WantPats, WantExprs, DNWExprs} = args(Args),
{match,0,to_list(WantPats,{var,0,'_'}),
{call,0,{remote,0,{atom,0,pareval},{atom,0,pareval}},
[to_list([{'fun',0,{clauses,[{clause,0,[],[],[E]}]}}
|| E <- WantExprs ++ DNWExprs])]}};
expr(Expr) ->
map(fun expr/1, Expr).
args(L) ->
lists:foldl(fun({match,_,Pat,Expr}, {WantPats, WantExprs, DNWExprs}) ->
{[Pat | WantPats], [expr(Expr) | WantExprs], DNWExprs};
(Expr, {WantPats, WantExprs, DNWExprs}) ->
{WantPats, WantExprs, [expr(Expr) | DNWExprs]}
end, {[], [], []}, L).
to_list(L) ->
to_list(L, {nil,0}).
to_list(L, Tail) ->
lists:foldr(fun(H, T) -> {cons,0,H,T} end, Tail, L).
map(Fun, Expr) ->
erl_syntax:revert(
erl_syntax_lib:map_subtrees(
fun(E) -> Fun(erl_syntax:revert(E)) end, Expr)).
This paste has no annotations.