GNU bug report logs - #71120
29.3; buglet in cl-loop

Previous Next

Package: emacs;

Reported by: Philippe Schnoebelen <phs <at> lmf.cnrs.fr>

Date: Wed, 22 May 2024 14:49:02 UTC

Severity: normal

Found in version 29.3

Done: Stefan Kangas <stefankangas <at> gmail.com>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Andrea Corallo <acorallo <at> gnu.org>
To: Philip Kaludercic <philipk <at> posteo.net>
Cc: 71120 <at> debbugs.gnu.org, Mattias Engdegård <mattiase <at> acm.org>, Stefan Monnier <monnier <at> iro.umontreal.ca>, Philippe Schnoebelen <phs <at> lmf.cnrs.fr>
Subject: bug#71120: 29.3; buglet in cl-loop
Date: Wed, 29 May 2024 17:33:49 -0400
Philip Kaludercic <philipk <at> posteo.net> writes:

> Philippe Schnoebelen <phs <at> lmf.cnrs.fr> writes:
>
>> When I need a list of 100 random dice throws I write
>>
>> 	(cl-loop for i from 1 to 100 collect (random 6))
>>
>> It compiles just fine.
>>
>> If instead I use
>>
>> 	(cl-loop for _i from 1 to 100 collect (random 6))
>>
>> then I get a compilation warning:
>>
>> 	foo.el:1:18: Warning: variable ‘_i’ not left unused
>>
>> It should be the other way around.
>
> The issue here is that the warning describes an issue in the output, in
> the latter case
>
>   (let* ((_i 1) (--cl-var-- nil))
>     (while (<= _i 100)
>       (setq --cl-var-- (cons (random 6) --cl-var--))
>       (setq _i (+ _i 1)))
>     (nreverse --cl-var--))
>
> As you see, _i is both evaluated in (+ _i 1) and updated.
>
> Here you have a minimal working example of the warning:
>
>   (byte-compile (lambda () (let ((_x 3)) _x)))
>
>   ;; Warning: variable ‘_x’ not left unused
>
> My guess is that fixing this would require cl-loop to notice that the
> counter is prefixed with a "_" and then use some other variable, but
> that might lead to issues with existing code.  Perhaps this
> transformation might be safe in that case:
>
>   (let* ((<fresh-variable> 1) (--cl-var-- nil))
>     (while (<= <fresh-variable> 100)
>       (let ((_i <fresh-variable>))
> 	(setq --cl-var-- (cons (random 6) --cl-var--))
> 	(setq <fresh-variable> (+ <fresh-variable> 1))))
>     (nreverse --cl-var--))
>
> I have added Mattias and Stefan to the CCs, as they'll probably have
> more qualified comments to add.

This is the same transformation that came to my mind reading the orginal
report, I think it should be safe.

BTW Philippe, you can workaround the bug with:

(cl-loop repeat 100 collect (random 6))

Bests

  Andrea




This bug report was last modified 78 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.