Subject: bug#66940: closed (Re: bug#66940: Dynamic scoping is all weird now?)

From: [email-masked] (GNU bug Tracking System)
Date: Wed, 08 Nov 2023 03:09:02 +0000

Your bug report

#66940: Dynamic scoping is all weird now?

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
66940: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=66940
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#66940: Dynamic scoping is all weird now?
From: Michael Heerdegen <[email-masked]>
To: Dave Goel <[email-masked]>
Cc: Gerd Möllmann <[email-masked]>, [email-masked]
Date: Wed, 08 Nov 2023 04:08:10 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Dave Goel <[email-masked]> writes:

> Thank you

Then let's close this one.

What I still wanted to say (to you): no need to complicate things using
macros here in your example.  Use functions, then variable references
are simple and clear.

If a macro (expansion) needs to refer to run-time values, use macro
arguments to pass an appropriate expression (like a variable).

But this is overkill in your case, no macros needed.  The purpose of
Lisp macros is to extend the language and/or rewrite code (at compile
time).  More or less, only that.  Always think twice if you really need
macros, try to avoid using macros when possible.  This will make the
code easier to understand and maintain.  Only if a macro introduces an
abstraction that makes the code actually easier to understand justifies
using one.

Michael.

Subject: Dynamic scoping is all weird now?
From: Dave Goel <[email-masked]>
To: [email-masked], Dave Goel <[email-masked]>
Date: Sun, 5 Nov 2023 00:06:49 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

I was playing around, checking my sanity re : dynamic scoping.  I'm
probably rusty, but I could swear that on older emacsen, this sort of code
would print 33 ten times.

On emacs -Q with debian stable (28.2).
I try this

(progn
  (setq lexical-binding nil)

  (dotimes (ii 10)
    (defmacro mac ()
      `(message "%S" ,ii)
      (sit-for 0.1))
    (let ((old_ii ii))
      (setq ii 33)
      (mac)
      (setq ii old_ii)
      )))

Exits without error the first two times, although, strangely, i don't see
any messages the second time. (I expected to see ten 33's).

*(a) As in, the second time, it doesn't print 33 ten times, as we would
expect.*
*(b) The third time is stranger. *
Let's evaluate it a third time! The third time is even weirder.
The third time, it complains
Debugger entered--Lisp error: (void-variable ii)
  (list 'message "%S" ii)
  (lambda nil (list 'message "%S" ii) (list 'print ii) (sit-for 0.1))()
  macroexpand((mac) nil)
  macroexp-macroexpand((mac) nil)
  macroexp--expand-all((mac))
  macroexp--all-forms(((setq ii 33) (mac) (setq ii old_ii)))
  macroexp--expand-all((let ((old_ii ii)) (setq ii 33) (mac) (setq ii
old_ii)))

and so on.

The bug(?) was reproduced on 29.1 as well - by e1f on #emacs

*(c) It gets even funnier. e1f changed ii to var, but the third time, it
still complained about ii, with the above error message, and not about var.*
I reproduced that as well.

Dave