[erlang-questions] How to wrap a function of any arity

Gaspar Chilingarov <>
Fri Nov 17 22:31:14 CET 2006


Ludovic Coquelle wrote:
> Sorry I did not give a good explanation of what I try to do. I would
> like to
> write the function "wrap_fun" so that I can call it with different inner
> functions. Let say I have different functions:
> compute_one/1
> compute_two/2
> I would like to be able to write:
> Log_compute_one = wrap_fun(compute_one, logger),
> Log_compute_two = wrap_fun(compute_two, logger).
>

you can test function arity and wrap it in a different ways.
2> F = fun(X) -> ok end.
#Fun<erl_eval.6.56006484>
3> is_function(F).
true
4> is_function(F, 1).
true
5> is_function(F, 2).
false


so your code should look like this:

wrap_fun(Fun, Pid) ->
   case Fun of
   Fun when is_function(Fun, 1) ->
       fun(AllArgs) ->
           Res = Fun(AllArgs),
           Pid ! Res
       end;
   Fun when is_function(Fun, 2) ->
       fun(X, X1) ->
           Res = Fun(X, X1),
           Pid ! Res
       end;
   ...
   end.

This is a little bit ugly, but should work.
In other hand, if you use functions with arity > 10 - I think it's
better to fix programming style, than write wrapper function to any
arity. Usually most of that arguments should be packet in a some State
record/tuple.


>
> On 11/18/06, t ty <> wrote:
>>
>> Unfortunately I'm not very sure what you need. You can always encode
>> all the params into a list also funs can also take multi params
>>
>> wrap_fun(Fun, Pid) ->
>>    fun(One, Two, Three) ->
>>      Res = Fun(One, Two, Three)
>>      Pid ! Res
>>    end.
>>
>> t
>>
>> On 11/17/06, Ludovic Coquelle <> wrote:
>> > I would like to wrap a function into another which send the the result
>> of
>> > the inner function to some external process.
>> > Let say I have a function called "compute" and a log process
>> "logger": I
>> > want to create a new function with something like:
>> >
>> > Log_compute = wrap_fun(compute, logger).
>> >
>> >  wrap_fun(Fun, Pid) ->
>> >     fun(AllArgs) ->
>> >          Res = Fun(AllArgs),
>> >         Pid ! Res
>> >      end.
>> >
>> > But I don't know how to do that with a function of any arity (the code
>> above
>> > work only for function of arity 1).
>> > Is this do-able? if not, how should I do?
>> >
>> >
>> > _______________________________________________
>> > erlang-questions mailing list
>> > 
>> > http://www.erlang.org/mailman/listinfo/erlang-questions
>> >
>> >
>> >
>>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions


-- 
Gaspar Chilingarov

System Administrator,
Network security consulting

t +37493 419763 (mob)
i 63174784
e 



More information about the erlang-questions mailing list