Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Erlang getting error ** 1: syntax error before: '->' **

Tags:

erlang

I have started some hands on in Erlang and I am getting : ** 1: syntax error before: '->' ** whenever i am declaring any function for eg. to calculate sum of a list (this is experimental, of cource there is Built In Function for find sum of a list).

sum([]) -> 0;
sum([H | T]) -> H + sum(T).

in erl shell (v 5.5.5).

Thanks in advance

like image 343
pranjal Avatar asked Aug 31 '10 19:08

pranjal


2 Answers

The straight answer is that in a module definition file you have attributes, like -module()., -export(). etc, and function definitions, while in the shell you enter expressions to be evaluated. A function definition is not an expression.

If you want to define a local, temporary function in the shell you need to use fun's as @DanielLuna has shown. These are really anonymous unnamed functions so calling themselves recursively is a pain, which is not specific to Erlang but common to all anonymous functions.

N.B.

Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end.

in shell does NOT define a function called Sum but defines an anonymous function and binds the variable Sum to it.

This is also why the only thing you can do in a module is define functions and not expressions to be evaluated when the module is loaded.

like image 37
rvirding Avatar answered Nov 25 '22 17:11

rvirding


You can't define functions in the shell using the same syntax as in an erl file.

You can define fun's though.

Syntax in the shell needs to be:

Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end,
Sum([1,2,3], Sum).

Note that recursive anonymous functions (which this is) are defined in an ugly way. You basically have to pass the function as an argument to itself.

like image 122
Daniel Luna Avatar answered Nov 25 '22 19:11

Daniel Luna