Subject: bug#68413: Ungexp doesn't work on deep lists

From: Josselin Poiret <[email-masked]>
Date: Sat, 13 Jan 2024 12:38:38 +0100

Hi Justin,

Justin Veilleux <[email-masked]> writes:

>> (define packages
>>         (list
>>          (cons "coreutils" coreutils)
>>          (cons "make" gnu-make)
>>          ...))
>>
>> #~(for-each
>>    (lambda (f)
>>      ... do-something)
>>    '#$packages)
>
> If I send a patch to "fix" this, will it be usefull or is there a reason
> for this behavior?

I think IMO that it's a bug, but it's also quite tricky to properly
traverse deep structures like this.  The bug comes from the fact that in
gexp->sexp, we traverse lists by matching the reference with (refs ...),
but that doesn't match if the reference is a pair instead.  Then, it
tries to match with ($ <gexp-input> (? self-quoting? x)), which does
match since self-quoting? apparently returns #t on a pair, whether or
not its constituents are also self-quoting.

Best,
-- 
Josselin Poiret