help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to avoid compiler warning `unused lexical variable' for `dolist'


From: Philipp Stephani
Subject: Re: How to avoid compiler warning `unused lexical variable' for `dolist' or `dotimes'?
Date: Sat, 9 Jan 2021 15:02:08 +0100

Am Sa., 9. Jan. 2021 um 14:30 Uhr schrieb Leo Butler <leo.butler@umanitoba.ca>:
>
> Stefan,
>
> I wonder why the lexical-binding version of dotimes is not implemented
> like:
>
> #+begin_src emacs-lisp
>   (let* ((start 0) (end (nth 1 spec)) (counter (gensym))
>          (body (subst counter (car spec) body)))
>           `(let ((,counter ,start))
>              (while (< ,counter ,end)
>                ,@body
>                (setq ,counter (1+ ,counter)))
>              ,@ (cddr spec))))
> #+end_src

That would be a semantically different operation. `dotimes' guarantees
that the counter variable is let-bound within each iteration. That
means that the macro expansion needs to contain something like
(let ((VAR ...)) BODY)
This distinction becomes relevant if BODY modifies VAR or captures it
in a closure.

> I am familiar with the comment in subr.el about uninterned symbols, but
> TBH, I don't have a sense of where the performance penalty might be
> of any significant size.

The uninterned vs. interned distinction is unrelated. `dotimes'
chooses to use an interned symbol as a micro-optimization, but it
doesn't affect its behavior.

>
> Leo
>
> Jean Louis <bugs@gnu.support> writes:
>
> > ********************************************************
> > Caution: This message was sent from outside the University of Manitoba.
> > ********************************************************
> >
> > * Stefan Monnier <monnier@iro.umontreal.ca> [2021-01-08 10:16]:
> >> > Only it is not relevant to macro or function that is documented to
> >> > work, but then again it gives warnings for `n' and not for `return' as
> >> > in above example.
> >>
> >> Not sure what you mean by "documented", but `C-h f dotimes` says:
> >>
> >>     dotimes is a Lisp macro in ‘subr.el’.
> >>
> >>     (dotimes (VAR COUNT [RESULT]) BODY...)
> >>
> >>       Probably introduced at or before Emacs version 21.1.
> >>
> >>     Loop a certain number of times.
> >>     Evaluate BODY with VAR bound to successive integers running from 0,
> >>     inclusive, to COUNT, exclusive.
> >>
> >>     Finally RESULT is evaluated to get the return value (nil if
> >>     RESULT is omitted).  Using RESULT is deprecated, and may result
> >>     in compilation warnings about unused variables.
> >>
> >> Notice the last sentence.
> >
> > Now I do notice it.
> >
> > I do switch to `while' and mapping functions rather.
> >
> > Jean
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]