[erlang-questions] Local namespaces in case/try

Richard Carlsson carlsson.richard@REDACTED
Tue Jul 10 12:30:15 CEST 2012


On 07/10/2012 11:40 AM, 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.

What you have to understand first is that it's not a compiler limitation 
- it's how the language was *designed*. The question about local scopes 
is not new; it has been discussed several times over the years, and it 
has been decided that mixing local scopes with Erlang's existing scoping 
rules would create a schizofrenic language. Variable scoping in Erlang 
is different from most other languages, but it's not random or poorly 
designed. You just have to learn how to work with it, and the result is 
usually (although not always) more readable code, when you do it right.

     /Richard

Here follows a quote from a mail that I had saved from 1996 by Håkan 
Millroth when the addition of let-expressions was discussed:

"One of the really attractive characteristics of Erlang as we know it 
today, is that all constructs in the language has simple semantics
that make sense also to imperative programmers.

I understand that several quite radical extensions to the language are 
now being considered by the Erlang language designers.  Several of these 
extensions are, in my opinion, bad ideas.  Below I explain why.

[I am not 100% sure that I describe the proposed extensions correctly 
below.  The reason for this is that there is, as far as I know, no 
"official" description of the extensions.]

Extension 1:

	let
	    Pat_1 = Expr_1,
	       ...
	    Pat_n = Expr_n
	in
	    BodyExpr
	end

	This introduces a new scope for the variables in Pat_1,...,Pat_n.

In most other functional langauges, this is how you introduce new 
variables.  It works just fine in these languages.  Clean and nice. BUT: 
Introduce this construct in Erlang and you get a bad design.

The principle in Erlang today is that a variable exists from its first 
occurrence to its last occurrence in a clause.  Very simple (maybe not 
as elegant as the first method, but simple). It is also consistent that 
case/if/receive follow this principle; this is not at all inelegant if 
we consider case/if/receive as control structures in the language.

When we mix these two principles in one language, we get an inconsistent 
and incoherent language design.

My advice to Erlang language (re)designers is: stick to one of the 
principles.  If you prefer the first one, then you should design a NEW 
language which is consistent with that principle.

...[discussion of other language extensions removed]"

(I could note that another of Håkan's comments was: "'++' is OK. 
However, there are several reasonable interpretations of what '--' 
should do, none of them more natural than the others. Please, keep your 
feet on the ground and forget '--'." Sadly, the advice was not taken.)



More information about the erlang-questions mailing list