[erlang-questions] Convert atom and arity into fun
Jeroen Koops
koops.j@REDACTED
Fri Sep 5 12:54:55 CEST 2008
I needed this as a quick way to invoke all exported functions from a
module whose names start with 'test_' - a miniature unit-test
framework if you will. Each function returns either true, if the test
succeeds, or {false, Reason} if it fails.
The following function gives a list of all exported functions starting
with 'test_' and arity 0:
tests() ->
lists:filter(fun({Name, Arity}) ->
Arity =:= 0 andalso lists:prefix("test_",
atom_to_list(Name))
end, module_info(exports)).
Next, using apply/3 as suggested by Gleb, they're all invoked and the
results formatted by:
[ case apply(?MODULE, X, []) of true -> {X, ok}; {false, Why} -> {X,
error, Why} end || {X,0} <- tests() ].
Works like a charm (until test-functions start throwing unexpected
exceptions, but I'll get to that when it actually happens)!
On Fri, Sep 5, 2008 at 12:45 PM, Richard Carlsson <richardc@REDACTED> wrote:
> Jeroen Koops wrote:
>> Given a function's name as an atom and an arity (for instance as
>> returned by module_info(exports)), how can I convert this into a fun
>> that I can invoke?
>
> There is currently no immediate way of doing this. If you just want
> to call the function, you can use M:F(...) or apply(M,F,[...]). If
> you need a fun, to pass it somewhere, you can wrap such a call in a
> new fun, like this: F = fun (...) -> M:F(...) end.
>
> /Richard
>
More information about the erlang-questions
mailing list