I have 2 parts of code I want to execute. Both are conditionals
if Value1 < N do something
else if Value1 >= N do something
if Value2 < N do something
else if Value2 >= N do something
I want at one statement of each to execute.
How does the if work in erlang? there is no else. I use multiple guards, but that looks like I have 4 if statements. in groups of 2.
if some condition
code;
if other condition
code
end.
I get a syntax error.
Syntax. if condition -> statement#1; true -> statement #2 end. In Erlang, the condition is an expression which evaluates to either true or false. If the condition is true, then statement#1 will be executed else statement#2 will be executed.
The best answer is don't use if, just use case. typically ok or undefined or noop are returned as atoms which mean essentially, nothing.
The form for an if
is:
if
<guard 1> -> <body1> ;
<guard 2> -> <body2> ;
...
end
It works trying the guards in if-clauses in top-down order (this is defined) until it reaches a test which succeeds, then the body of that clause is evaluated and the if
expression returns the value of the last expression in the body. So the else
bit in other languages is baked into it. If none of the guards succeeds then an if_clause
error is generated. A common catch-all guard is just true
which always succeeds, but a catch-all can be anything which is true.
The form for a case
is:
case <expr> of
<pat 1> -> <body1> ;
<pat 2> -> <body2> ;
...
end
It works by first evaluating and then trying to match that value with patterns in the case-clauses in op-down order (this is defined) until one matches, then the body of that clause is
evaluated and the case
expression returns the value last expression in the body. If no pattern matches then a case_clause
error is generated.
Note that if
and case
are both expressions (everything is an expression) so they both must return values. That is one reason why there is no default value if nothing succeeds/matches. Also to force you to cover all options; this is especially important for case
. if
is just a degenerate case of case
so it inherited it. There is a bit of history of if
in the Erlang Rationale which you can find on trapexit.org under user contributions.
Erlang doesn't allow you to have an if
without a true
statement option. Whether or not this is something that is a true statement or an actual true
is up to you, but it is commonplace to have your true
be the else
in other languages.
if
some_condition -> some_code;
some_other_condition -> some_other_code;
true -> else_code
end.
See the "What the If?" section on this page for more on this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With