[erlang-questions] if and fun with erl
Frédéric Trottier-Hébert
fred.hebert@REDACTED
Tue Feb 1 14:29:01 CET 2011
On 2011-02-01, at 08:20 AM, Yann SECQ wrote:
> Dear erlang users,
>
> I'm beginnning my journey with this language and I'm a bit
> surprised by a strange behaviour concerning if within fun.
> I'm probably missing something obvious but I've not been
> able to find any clue on the official documentation or the web.
>
> I wanted to write within the erlang shell something like:
>
> 13> Compare = fun(X, Y) ->
> if X>Y -> greater;
> X==Y -> equal;
> X<Y -> less
> end.
> * 1: syntax error before: '.'
This is missing an 'end'. the syntax is 'fun([Args]) -> ... end' (where the [] around Args mean they're optional) and 'if ... end'.
>
> So I tried to add another 'end' to match the 'if' declaration
>
> 13> Compare = fun(X, Y) ->
> if X>Y -> greater;
> X==Y -> equal;
> X<Y -> less
> end,
> end.
> * 1: syntax error before: 'end'
>
The ',' is an expression, not a line terminator; you do not need it in this case.
> With no more success. What surprises me is that if I catch
> the conditional return value it works:
>
> 14> Compare = fun(X, Y) ->
> Res = if X>Y -> greater;
> X==Y -> equal;
> X<Y -> less
> end,
> Res
> end.
> #Fun<erl_eval.12.113037538>
This is because now you add a ',' and the Res variable, which are two separate expressions. 'Res' must not be followed by a comma (and isn't) because no expression comes after. This is normal and expected behaviour.
>
> What bugs me is that when doing this in a module:
>
> compare(X, Y) ->
> if X>Y -> greater;
> X==Y -> equal;
> true -> less
> end.
>
> It works as expected !
Of course. The syntax is fine this time!
>
> Can someone explain me what I'm missing to be able to return
> directly the conditional result without having to go through
> the Res temporary variable when using erl ?
if Cond1 -> Ret1;
Cond2 -> Ret2;
...
CondN -> RetN
end.
You might want to give a read to one of my blog posts, 'On Erlang's Syntax' (http://ferd.ca/on-erlang-s-syntax.html) which attempts to make this kind of syntactic issues easier to understand. Hopefully this will help.
--
Fred Hébert
http://www.erlang-solutions.com
More information about the erlang-questions
mailing list