Paste number 51674: my pare equivalent

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:
Raw Source | XML | Display As
-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.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.