[erlang-questions] Calling external modules from a fun

Robert Virding <>
Wed Apr 28 22:17:34 CEST 2010


On 28 April 2010 17:19, Raimo Niskanen
<> wrote:
> Try this on any two nodes (substitute Node2):
>
>    (Node1)1> rpc:call(Node2, erl_eval, exprs,
>                       [[{call,1,{remote,1,{atom,1,io},{atom,1,format}},
>                          {string,1,"~p~n"},
>                          {cons,1,
>                           {call,1,{remote,1,{atom,1,erlang},{atom,1,nodes}},
>                            []},
>                           {nil,1}}]}],
>                       []]).
>    [Node1]
>    {value,ok,[]}
>    (Node1)2>
>
> Where I got the long awful list (Parsed) from:
>
>    {ok,Scanned,_} = erl_scan:string("io:format(\"~p~n\", [erlang:nodes()]).").
>    {ok,Parsed} = erl_parse:parse_exprs(Scanned).
>    Bindings = erl_eval:new_bindings().
>
> and then
>
>    rpc:call(Node2, erl_eval, exprs, Parsed, Bindings).

Of course if you are going to be doing a lot of sending of source code
to be evaluated on a remote machine then it would be easier and
shorter to use LFE. The equivalent to the above in vanilla erlang is:

Expr = [':',io,format,[quote,"~p~n"],[list,[':',erlang,nodes]]],
rpc:call(Node2, lfe_eval, expr, [Expr]).

Doing it all in LFE if course even nicer:

(let ((e '(: io format '"~p~n" (list (: erlang nodes)))))
  (: rpc call node 'lfe_eval 'expr (list e)))

Robert


More information about the erlang-questions mailing list