[erlang-questions] Why doesn't Erlang has return statement?

Richard A. O'Keefe ok@REDACTED
Thu Dec 18 03:40:03 CET 2014


Let me offer one example of how ‘return’ can affect things.

Suppose I have a function

   foo(<|args|>) ->
      <|stuff|>.

Now suppose I discover that this is sometimes returning integers
and sometimes returning floats, but my life would be easier if
it always returned floats.  Easy:

    foo(<|args|>) ->
        float((
        <|stuff|>)).

I don’t have to look inside <|stuff|> at all.  Any value returned
will be caught this way.  But in the presence of ‘return’, I have
to locate each and every ‘return’ and patch that separately.

Yes, I have had to do this kind of thing in C.  I am actually
quite tired of writing
   #define safely(e) (void)(<|clean up|>), e
macros and changing
    return e;
to
    return safely(e);
and then finding I’ve missed one.   This is of course why
Lisp provides unwind-protect, which Java copied as
try-finally.

What is the price of NOT having return?

Code duplication in a few rare cases.

case E1 of P1 -> .., ^E2 ; P2 -> .., ^E3 ; P3 -> .. ; P4 -> .. end, E5

has to become

case E1 of P1 -> .., E2 ; P2 -> .., E3 ; P3 -> .., E5 ; P4 -> .., E5 end

A compiler that does cross-jumping optimisation can eliminate the
duplication in the BEAM code.

If you keep your function bodies small, a little bit of duplication
won’t be a problem.  (Is Garrett Smith reading this thread?)


More information about the erlang-questions mailing list