[erlang-questions] Code generation (was NOOB)
Jay Nelson
jay@REDACTED
Wed Sep 6 04:32:28 CEST 2006
Robert Virding wrote:
> Jay Nelson wrote:
>>> foo(X) ->
>>> A = [do_something(E) || E <- X], % <1>
>>> [do_other(E) || E <- X], % <2>
>>> ok.
>
> You must clarify what you mean is the exact difference between <1> and
> <2>? Is it the explicit assignment to A? Or that the return value is
> never used?
I incorrectly used the example for two cases: asking Bjorn about
compiler optimizations and demonstrating use cases for list
comprehensions. Ideally the compiler should not generate a list in
either case, since it knows in both cases the result is never used.
The case of <1> is possibly a programmer error, so I would expect a
warning of an unused variable (sorry, let's not open that discussion
again) since the code indicates to a human reader to expect A to be used
later.
In the case of <2> the intent is clear mainly to the human, but
incidentally to the compiler, that the result is not intended to be used
and cannot be used. The statement clearly exists only for side effects.
> Actually, the only difference between <1> and <2> is that <1> calls
> do_something on each element of X, while <2> calls do_other.
When I was talking about the difference between the two, I should have
used a different example wherein A was actually referenced later.
Change the above return value to {ok, A} for the sake of this discussion.
>
> P.S. I think you should use code which builds a list when you want to
> build a list, not for side-effects! But then again I am a purist.
I agree and am fairly pedantic about such things, but I find the foreach
statement verbose and hard to read. I am proposing that the clarity and
succinctness of list comprehensions wins out. I would throw out the
foreach statement from the lists module and always use list
comprehensions. Simplicitly and brevity of a single statement with two
clear uses, versus two separate statements.
The fact that list comprehensions always construct a list is an artifact
of their genesis. I agree their syntax intentionally suggests you are
creating a list, but I still prefer the readability even only for side
effects. Using them and reading them clicks my mind into erlang mode.
Just my opinion, though. I understand the other side is a reasonable
position.
jay
More information about the erlang-questions
mailing list