diff options
author | José Valim <jose.valim@plataformatec.com.br> | 2013-12-23 18:23:08 +0100 |
---|---|---|
committer | José Valim <jose.valim@plataformatec.com.br> | 2013-12-23 18:23:08 +0100 |
commit | f81a15b7cb1dbba4d7ef4203fdd4e3ed3a9ddd7d (patch) | |
tree | 70a42b472518c90faaa01899977ec0a50849f1cf /lib/elixir/src/elixir_fn.erl | |
parent | 51aef55c830b770d85c1add1eccd6dcb440fd018 (diff) | |
download | elixir-f81a15b7cb1dbba4d7ef4203fdd4e3ed3a9ddd7d.tar.gz |
Expand fn
Diffstat (limited to 'lib/elixir/src/elixir_fn.erl')
-rw-r--r-- | lib/elixir/src/elixir_fn.erl | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/elixir/src/elixir_fn.erl b/lib/elixir/src/elixir_fn.erl index f48642a89..20b6cc320 100644 --- a/lib/elixir/src/elixir_fn.erl +++ b/lib/elixir/src/elixir_fn.erl @@ -1,5 +1,5 @@ -module(elixir_fn). --export([fn/3, capture/3]). +-export([fn/3, capture/3, expand/3]). -import(elixir_scope, [umergec/2]). -import(elixir_errors, [syntax_error/3, compile_error/4]). -include("elixir.hrl"). @@ -25,6 +25,16 @@ translate_fn_match(Arg, S) -> { TArg, TS } = elixir_translator:translate(Arg, S#elixir_scope{extra=fn_match}), { TArg, TS#elixir_scope{extra=S#elixir_scope.extra} }. +%% Expansion + +expand(Meta, Clauses, E) -> + Transformer = fun(Clause, Acc) -> + { EClause, EC } = elixir_exp_clauses:expand_clause(fun elixir_exp:expand_many/2, Clause, Acc), + { EClause, elixir_env:mergec(E, EC) } + end, + { EClauses, _ } = lists:mapfoldl(Transformer, E, Clauses), + { { fn, Meta, EClauses }, E }. + %% Capture capture(Meta, { '/', _, [{ { '.', _, [_, F] } = Dot, RequireMeta , [] }, A] }, E) when is_atom(F), is_integer(A) -> @@ -72,8 +82,6 @@ capture(Meta, Arg, E) when is_integer(Arg) -> capture(Meta, Arg, E) -> invalid_capture(Meta, Arg, E). -%% Helpers - capture_import(Meta, { Atom, ImportMeta, Args } = Expr, E, Sequential) -> Res = Sequential andalso elixir_exp_dispatch:import_function(ImportMeta, Atom, length(Args), E), |