[erlang-questions] Copy function from one Module to another

55 views
Skip to first unread message

Tyron Zerafa

unread,
Aug 14, 2012, 10:56:19 AM8/14/12
to erlang-q...@erlang.org
Hey all,
    Is there any mechanism in Erlang which I can use to copy functions from one module to another? So, if I have module A containing functions a, b and c, is there any way in which I can copy a to module B?

Thanks 
Tyron

Jesse Gumm

unread,
Aug 14, 2012, 11:10:39 AM8/14/12
to Tyron Zerafa, erlang-q...@erlang.org

That sounds like you're looking for

-import(Module, Functions).

http://www.erlang.org/doc/reference_manual/modules.html

--
Jesse Gumm
Owner, Sigma Star Systems
414.940.4866 || sigma-star.com || @jessegumm

_______________________________________________
erlang-questions mailing list
erlang-q...@erlang.org
http://erlang.org/mailman/listinfo/erlang-questions

Tyron Zerafa

unread,
Aug 14, 2012, 11:15:15 AM8/14/12
to Jesse Gumm, erlang-q...@erlang.org

Hey Jesse
    I need something stronger than just import. I need to put a bunch of functions from different modules into a single one and transfer this to a remote node. Then I want to be able to use these functions from the remote node. 
If I simply use import, I will not be able to use them on the remote node without explicitly transferring all the modules to which the functions belong to.

--
Best Regards,
Tyron Zerafa

Siraaj Khandkar

unread,
Aug 14, 2012, 11:25:30 AM8/14/12
to Tyron Zerafa, erlang-q...@erlang.org, Jesse Gumm
How about sending a message with a fun? Or collecting desired funs in
a record and sending that?


On Tue, Aug 14, 2012 at 11:15 AM, Tyron Zerafa <tyron....@gmail.com> wrote:
>
> Hey Jesse
> I need something stronger than just import. I need to put a bunch of
> functions from different modules into a single one and transfer this to a
> remote node. Then I want to be able to use these functions from the remote
> node.
> If I simply use import, I will not be able to use them on the remote node
> without explicitly transferring all the modules to which the functions
> belong to.
>
>
> On Tue, Aug 14, 2012 at 5:10 PM, Jesse Gumm <gu...@sigma-star.com> wrote:
>>
>> That sounds like you're looking for
>>
>> -import(Module, Functions).
>>
>> http://www.erlang.org/doc/reference_manual/modules.html
>>
>> --
>> Jesse Gumm
>> Owner, Sigma Star Systems
>> 414.940.4866 || sigma-star.com || @jessegumm
>>
>> On Aug 14, 2012 9:56 AM, "Tyron Zerafa" <tyron....@gmail.com> wrote:
>>>
>>> Hey all,
>>> Is there any mechanism in Erlang which I can use to copy functions
>>> from one module to another? So, if I have module A containing functions a, b
>>> and c, is there any way in which I can copy a to module B?

Tyron Zerafa

unread,
Aug 14, 2012, 11:28:32 AM8/14/12
to Siraaj Khandkar, erlang-q...@erlang.org, Jesse Gumm
I was thinking about the latter where I will collect all functions in a record and send that.
The problem is that I will have to come up with a way to extract a function form a module, that is why I was checking out whether there is anything already implemented in Erlang. 

Fred Hebert

unread,
Aug 14, 2012, 12:09:38 PM8/14/12
to Tyron Zerafa, erlang-q...@erlang.org, Jesse Gumm
Why do you want to do this, instead of, for example, just sending the module to the other node?

{Mod, Bin, File} = code:get_object_code(Mod),
rpc:call(Node, code, load_binary, [Mod, File, Bin]).


or alternatively use rpc:multicall(Nodes) for many nodes and doing the same.

Tyron Zerafa

unread,
Aug 14, 2012, 12:20:20 PM8/14/12
to Fred Hebert, erlang-q...@erlang.org, Jesse Gumm
I want to implement code migration where a user just will be able to call migrate(RemoteNode, Fun) and that local fun will end up on the RemoteNode. 
Thus this needs to be generic. I cannot assume that:
1) All functions within the module are going to be used - transferring code which will not be used will result in useless bandwidth costs.
2) All functions required are within a single module 

I was going to perform a static analysis of the function to be migrated and transfer only the functions it depends on. 

Geoff Cant

unread,
Aug 14, 2012, 2:01:25 PM8/14/12
to Tyron Zerafa, erlang-q...@erlang.org
You won't be able to do exactly what you have asked for as functions only exist inside modules. Even funs are just context plus a reference to code in a module. You cannot run a fun on a node that doesn't have the module it references. 

While I'm sure that Fred's idea is the best (you'd have to be sorely bandwidth constrained before other trade offs make sense) the middle ground would be to compile a new module with just the function + deps you want to migrate and send that to the remote node. You would probably need debug_info in the original module for this to work. 

In your position I would use Fred's scheme. The 3-liner beats the complicated recompilation solution 99 times out of 100. 

-Geoff

Richard O'Keefe

unread,
Aug 14, 2012, 7:48:05 PM8/14/12
to Tyron Zerafa, erlang-q...@erlang.org, Jesse Gumm

On 15/08/2012, at 3:15 AM, Tyron Zerafa wrote:

>
> Hey Jesse
> I need something stronger than just import. I need to put a bunch of functions from different modules into a single one and transfer this to a remote node. Then I want to be able to use these functions from the remote node.

Never mind a remote node, I just can't see taking a random bunch of functions from
different modules and stuffing them into another module making any kind of sense.

Consider:
-module(a).
..
f() -> g().
g() -> 12.

-module(b).
..
h() -> g().
g() -> 34.

Now, "put" a:f/0 and b/h:0 into a new module c.
What happens to g?

The only way I can even begin to make sense of this is to construct
the new module thus:
-module(c).
-export([f/0,h/0]).
f() -> a:f().
h() -> b:h().
and then to provide *all* of the modules.
Reply all
Reply to author
Forward
0 new messages