[erlang-questions] behavior of lists:append/1

zxq9 zxq9@REDACTED
Wed Sep 18 23:54:29 CEST 2019


On 2019/09/18 21:00, Raimo Niskanen wrote:
> On Tue, Sep 17, 2019 at 11:25:11PM +0900, zxq9 wrote:
>> On 2019/09/17 22:13, Raimo Niskanen wrote:
>>> On Mon, Sep 16, 2019 at 10:53:57PM +0900, zxq9 wrote:
>>> No.
>>>
>>> lists:append/2 can be used and *is* used by existing code to construct
>>> improper lists.  It would break backwards compatibility.
> 
> ...to construct improper lists even as in appending a tail element (that is
> need not be a list) to a list...

At least here we can put down a line and say "that's a violation of the 
typespec", because it is:
http://erlang.org/doc/man/lists.html#append-2

So if we want to continue to use append/2 to *create* improper lists 
(which I've never once encountered anywhere in the last decade, but 
maybe you've got some examples of super wizard code where this is 
necessary?) then the typespec should be changed, otherwise I think it 
isn't unreasonable to do at +O(1) cost at runtime what Dialyzer would 
do, or just leave things as they are and actively discourage deliberate 
construction of improper lists via append/2.

I'm not particularly opposed to changing the typespec to say "List2 can 
be whatever because who cares whether lists are lists or not? Let's 
ditch type sanity because a handful of people feel like it! WOOO!" but I 
*do* believe it is inconsistent to the extreme to say "Well, we're going 
to have Dialyzer (and all users who read the documentation... har har 
har! Joke's on them!) believe that both arguments must be lists!" and 
then in unofficial -- but heavily referenced -- discussion have an OTP 
developer say "well, append/2 is used by some people to deliberately 
construct improper lists, so let's just ignore the discussion entirely 
even though there is actually a way to efficiently check this at runtime".

-Craig



More information about the erlang-questions mailing list