visibility of a function in a module
Joe Armstrong
joe@REDACTED
Fri Apr 11 14:28:20 CEST 2003
> In this module, f(N) is a function visible in the entire module of test.
> % --------------------
> -module(test).
> -export([do/0]).
>
> do() ->
> go().
>
> f(N) ->
> Base = 10,
> Base + N.
>
> go() ->
> io:format("~w~n", [f(3)]).
> % ---------------------------
> But, I want to construct f() when do() is invoked.
> Now, I have the following module, in which F_() is not visible in
> the module. And I need to pass it to go() through the parameter passing.
> Is this the only alternative ?
> % -----------------------------
> -module(test).
> -export([do/1]).
>
> do(Base) ->
> F_ = fun(N) -> Base+N end,
> go(F_).
>
> go(F) ->
> io:format("~w~n", [F(3)]).
> % --------------------------------------
>
Richard Carlsson made something like this (called Parameterised modules)
The idea is that you'd write:
-module(test(Base)).
-export([do/0]).
f(N) ->
Base + N.
do() ->
io:format("~w~n", [f(3)]
--------
To use this you'd do like this:
M = load (test(Base)),
M:do()
This can be implemented by some relatively simple code transformations.
However you look at it there is no way of statically binding a dynamically
created fuction to a name - you have to store it in some variable F and
carry it round the computation until you wish to use it and then say F(Args)
There are of course many many ways of doing this ...
f(Base) ->
put(dingo, fun(N) -> N + Base end).
do() ->
io:format("~w~n", [(get(dingo))(3)].
Does the same as your code in a way that is not "recommended" (TM)
by some :-)
/Joe
More information about the erlang-questions
mailing list