[erlang-questions] Local namespaces in case/try

Richard O'Keefe <>
Wed Jul 11 03:27:53 CEST 2012


On 10/07/2012, at 9:40 PM, Sergei Lebedev wrote:,
> 
> While this indeed *may* be a sign of a problem in your code, for the original example this is hardly the case. Splitting the function apart *only* because of compiler limitations sounds like an ad-hoc hack, not a real solution.

I have shown in another message how we can get exactly the intended effect,
in the language as it stands with no changes or extensions.

The most important point here is that we are ***NOT*** talking about
an accidental limitation where a compiler doesn't do something because
the authors were too lazy or too incompetent or too resource-limited
to do it or anything else like that.

There is a software engineering reason:

    It is simply a bad idea to use the same name for two different
    variables within a short stretch of code.  In my experience in
    Algol, C, Pascal, &c: if code that does that isn't buggy now,
    it soon will be.

There is a programming language reason:

    Languages that allow nested variable scopes require some sort
    of declaration marker than says which variables are new.
    I can think of a few exceptions (TCL, Icon, Fortran 66) where
    the default is that any variable in a function is local unless
    explicitly marked as global, but those languages do not allow
    nested scopes within a function.

    Erlang used not to have nested variable scopes at all.
    When funs were introduced, it got some, but it is still the
    case that one function-or-fun-clause = one contour.

    Changing this requires some sort of language change.

There is a backwards compatibility reason:

    Some programmers think that if it is good enough for Dijkstra's
    notation to say that after
	if p => x vir:= 1
	[] non p => x vir:= 2
	fi
    the variable x is initialised, and if it is good enough
    for Java to say that after
	int x;
	if (p) x = 1;
	else x = 2;
    the variable x is initialised, then it is good enough for
    Erlang to say that after
	if P    -> X = 1
	 ; true -> X = 2
	end
    the variable X is initialised.  This is especially important
    when the choices need to initialise several variables, and
    packing them up into an entirely artificial tuple and then
    unpacking it afterwards is both error-prone and unclear.

So what you really need is a way to say WHICH variables are
private to an expression.  Perhaps

	local Result, Error in
	    case ...
	local Result, Error in
	    case ...

where 'local' would only count as a keyword if immediately followed
by a variable name.


As for 'hacks', I remain to be convinced that using the same variable
for two different purposes in the same clause is a *SERIOUS* need.




More information about the erlang-questions mailing list