[erlang-questions] guard expression restriction

Richard O'Keefe <>
Thu Dec 2 04:16:51 CET 2010


On 2/12/2010, at 7:22 AM, James Churchman wrote:

> Interestingly list comprehensions offer custom guards, if that it of use to you.

And what a disaster THAT is.
Consider

	1> 1+a > 2.
	** exception error: bad argument in an arithmetic expression
	      in operator +/2
                 called as 1 + a

In a *guard*, this would be a silent failure.
As an expression (which it should never have been allowed to be),
exceptions are raised and propagated through > .

	2> [X || X <- lists:seq(1,100), X+a > 2].
	[]

Here the exception became a silent failure.  So the guard is a guard.


	3> math:cos(foo) > 1.
	** exception error: bad argument
	     in function math:cos/1
	        called as math:cos(foo)

	4> [X || X <- lists:seq(1,100), math:cos(foo) > X].
	** exception error: bad argument
	     in function math:cos/1
		called as math:cos(foo)

Here the exception did NOT become a silent failure!

If the guards in list comprehensions are GUARDS, then *any*
exception inside one should turn into a silent failure, and
query 4 should have the answer [] with no carping.

If the guards in list comprehensions are EXPRESSIONS, then
every expression inside one should be propagated, and query
2 should have raised an exception.

It's even worse.  If guards in list comprehensions had been
guards, we'd have been able to use Pattern = Expression to
bind variables locally inside comprehensions, instead of
having to use the kluge Pattern <- [Expression].

Inconsistent treatment of tests in comprehensions like this
is a real menace.  I would value some kind of static check
that the guards in comprehensions are proper guards.






More information about the erlang-questions mailing list