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: Jean Louis
Subject: Re: How to avoid compiler warning `unused lexical variable' for `dolist' or `dotimes'?
Date: Fri, 8 Jan 2021 05:38:14 +0300
User-agent: Mutt/2.0 (3d08634) (2020-11-07)

* Stefan Monnier <monnier@iro.umontreal.ca> [2021-01-08 05:22]:
> >> Indeed, I don't like this 3-arg form of `dotimes` and `dolist` because
> >> it tends to "hide" the return value.  But we keep it because there's
> >> something to be said for not being "gratuitously" different from
> >> Common-Lisp.
> >
> > I do not see how it hides when I know how it is used from Common
> > Lisp.  So I look there in third value and I know which one will be
> > returned.
> 
> It's hidden because it's not at the usual place where the return value
> is usually placed (i.e. in the last expression).

I understand your viewpoint. But I learned it in Common Lisp and for
me it is not hidden. I know that nothing will be returned unless
declared what to return. And I just guess, that `dotimes' was included
in Emacs Lisp as to duplicate Common Lisp.

However, I try to have Emacs Lisp mostly clean from Common Lisp
constructs. So I may change my `dotimes' forms into `while' forms or
where it applies to some of the mapping functions.

> In contrast in `dotimes` and `dolist` it's placed in
> a sub-sub-expression and moreover it's one that's rarely used (arguably
> *because* it's too deeply nested), so you're likely to miss it if you
> don't go looking for it very actively.
> 
> Not that it matters anyway

Maybe somebody would miss, but I don't. This may be because forms I
have are rather short, example:

(defun pct-plus (amount percent)
  "Return AMOUNT increased for PERCENT of it."
  (let* ((percent (* amount percent))
         (result (+ amount percent)))
    result))

(defun pct-plus-times (amount percent times)
  "Return AMOUNT increased for PERCENT for number of TIMES."
  (dotimes (var times amount)
    (setq amount (pct-plus amount percent))))

And I see that `var' is unused there. I have never used those
functions in a package so there were no warnings.

Then I can replace the above function to following:

(defun pct-plus-times (amount percent times)
  "Return AMOUNT increased for PERCENT for number of TIMES."
  (let ((n 0))
    (while (/= n times)
      (setq amount (pct-plus amount percent))
      (setq n (1+ n)))
    amount))

And it does the same hopefully, it appears to me more Emacs Lisp-ish,
but looks uglier, though it is more understandable to me and it is the
kind of what I learned about loops from old times.




reply via email to

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