Subject: bug#24875: 26.0.50; In Dotted Pair Notation, the read function returns CDR if CAR is absent

From: Stefan Monnier <[email-masked]>
Date: Tue, 06 Jul 2021 12:43:58 -0400

Lars Ingebrigtsen [2021-07-06 17:32:26] wrote:

> Chunyang Xu <[email-masked]> writes:
>
>> For example, I eval this in the *scratch* buffer:
>>
>> (read "( . 123)")
>>      ⇒ 123
>>
>> (read "(1 . ( . (3 . nil)))")
>>      ⇒ (1 3)
>>
>> I can't find explanation about this behavior in elisp manual. Is it
>> expected?
>
> That is indeed very eccentric behaviour, so we should probably mention
> it somewhere?  (I guess we can't change it.)
>
> Anybody got an opinion here, or a way that we can describe it in the
> manual except pointing at the examples and then going ¯\_(ツ)_/¯?

It's the "natural" behavior if you start from

    (Ea . Ed)

as the notation for cons cells and extend it to

    (E1 E2 E3 .. . Ed)

such that

    (E1 {foo} . Ed) = (E1 . ({foo} . Ed))

because then you replace `{foo}` with the empty sequence and you get:

    (E1 . Ed) = (E1 . ( . Ed))

and hence

    Ed = ( . Ed)

It's not used very often, so in theory we could potentially change it,
but I haven't seen any good alternative interpretation for it, and
I don't see the benefit of signaling an error.

        Stefan