[erlang-questions] Calling a Function with Same argument twice
Rob Charlton
rob@REDACTED
Thu Oct 15 13:16:45 CEST 2009
sapan shah wrote:
> So, the basic question is: If the test/2 function is side effect free (no
> put, no get or no io:format..), would erlang evaluater still call the test/2
> function again, if it had called the same fuction with same arguments
> erlier???
>
Try this code and see:
-module(side_effect_test).
-compile(export_all).
-include_lib("stdlib/include/ms_transform.hrl").
test() ->
dbg:tracer(),
dbg:p(all,call),
dbg:tpl(?MODULE,dbg:fun2ms(fun(_)->return_trace() end)),
%% and now the test
test2(side_effect_free(2,2),side_effect_free(2,2)).
test2(A,B) ->
ok.
side_effect_free(A,B) ->
A + B.
And the output:
1> side_effect_test:test().
(<0.31.0>) call side_effect_test:side_effect_free(2,2)
(<0.31.0>) returned from side_effect_test:side_effect_free/2 -> 4
(<0.31.0>) call side_effect_test:side_effect_free(2,2)
(<0.31.0>) returned from side_effect_test:side_effect_free/2 -> 4
(<0.31.0>) call side_effect_test:test2(4,4)
(<0.31.0>) returned from side_effect_test:test2/2 -> ok
So the answer is no - Erlang doesn't know that "side_effect_free" is
free of side effects and that multiple calls with the same parameters
can be optimized away, and so will evaluate it twice.
Cheers
Rob
--
Erlang Training and Consulting Ltd
www.erlang-consulting.com
More information about the erlang-questions
mailing list