Tue Apr 5 15:06:39 CEST 2016
> What you're missing is operator precedence  - "and" takes precedence
> over "<", so your guard clause ends up looking, to the runtime, like what
> Bengt pointed out - you have the boolean expression `is_inteteger(X) or
> is_float(X)` followed by and, followed by X - which is evaluated before the
> < operator. The evaluation of your guard looks something like this:
> X = 1
> (((is_integer(1) or is_float(1)) and 1) < 5
> (((true) and 1) < 5)
> `true and 1` cannot be evaluated (throws an exception, as `and` doesn't
> take integer arguments). Now, your guard expression threw an exception -
> what happens then:
> "If an arithmetic expression, a Boolean expression, a short-circuit
> expression, or a call to a guard BIF fails (because of invalid arguments),
> the entire guard fails. If the guard was part of a guard sequence, the next
> guard in the sequence (that is, the guard following the next semicolon) is
> evaluated." 
> So, your guard ends up not matching - you have no other function clauses,
> so you have "no function clause matching."
> Make sense now?
Thank you Doug. Yes - it makes sense. However operator precedence, which I
previously checked, do not specify and & or:
Therefore I assumed precedence was the same, and that is confusing.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the erlang-questions