[erlang-questions] Beginner: What's wrong with this code?

Kostis Sagonas kostis@REDACTED
Wed Jun 22 14:32:09 CEST 2011


Sid Carter wrote:
> 
> Hi Folks,
> 
> New to Erlang and playing with code and trying to learn erlang.
> 
> I have been reading the getting started guide and trying this code (on 
> Mac OS X with erlang from MacPorts):
> 
> -module(first).
> % call would look like format_temps([{moscow,{f,-40}}, 
> {bangalore,{f,40}}, {wellington, {c,24}}]).
> -export([format_temps/1, start/0]).
> format_temps([]) ->
> ok;
> format_temps([City|Rest]) ->
> print_temp(convert_to_celsius(City)),
> format_temps(Rest). 
> convert_to_celsius({City, {c, C}}) ->
> {City, {c, C}};
> convert_to_celsius({City, {f, F}}) ->
> {City, {c, (F-32)*5/9}}.
> print_temp({City, {c, C}}) ->
> io:format("~p has a temperature of ~w C~n",[City,C]).
> start() ->
> Pid = spawn(?MODULE, format_temps, [{moscow,{f,-40}}, 
> {bangalore,{f,40}}, {wellington, {c,24}}]),
> Pid.
> 
> When I try to run:
> 
> first:format_temps(args).
> 
> I don't have any problems. I get the correct response.
> 
> When I try to run as:
> 
> first:start().
> 
> I get the following error:
> 
> Error in process <0.49.0> with exit value: 
> {undef,[{first,format_temps,[{moscow,{f,-40}},{bangalore,{f,40}},{wellington,{c,24}}]}]}
> 
> What's wrong?

Others have already explained the problem and suggested a fix for it. 
But these kinds of errors (forgetting one set of list brackets) are very 
common. They can easily be avoided if one writes in more modern Erlang 
rather than in Erlang of 10 years ago. In this particular case, you can 
use a spawn with a fun that makes the call to function format_temps/1 clear:

    spawn(fun () ->
	    ?MODULE:format_temps([{moscow,{f,-40}},
				  {bangalore,{f,40}},
				  {wellington, {c,24}}])
	 end)

An added bonus is that in this form you can choose to make a local call 
to the format_temp/1 function instead of a remote one. I.e. write it as 
follows:

    spawn(fun () ->
	    format_temps([{moscow,{f,-40}},
			  {bangalore,{f,40}},
			  {wellington, {c,24}}])
	 end)

Kostis



More information about the erlang-questions mailing list