From: Alan Mackenzie <acm@muc.de>
To: emacs-devel@gnu.org
Subject: Trouble with lexical-binding.
Date: Mon, 13 Apr 2015 22:03:17 +0000 [thread overview]
Message-ID: <20150413220317.GC6324@acm.fritz.box> (raw)
Hello, Emacs.
I recently tried out M-x auto-insert in a file.el, and it caused a
testing macro to fail. The critical point was the default setting of
lexical-binding to t in the first line.
Reduced to its essentials, my problem is a file looking like this:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; lexical-bug.el --- lexical bug -*- lexical-binding: t; -*-
(eval-when-compile
(defmacro test-ptr (x)
`(let* ((ptr (copy-tree ,x))
(form '(setcar ptr 'a))
(result (eval form)))
(message "result is %s, ptr is %s" result ptr))))
(test-ptr '(x y z))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
When I byte-compile it, I expect on loading it to get the result message
in the message area. This works fine without the lexical binding. With
the LB, instead I get an error about `ptr' being unbound - clearly, in
the form `(eval form)', i.e. `(eval `(setcar ptr 'a))', there is no `ptr'
in `eval''s stack frame.
Obviously, this bit of the code needs dynamic binding. So I should be
able to bind `lexical-binding' to nil at some strategic place to achieve
this. I'm not quite sure where this place is, but nowhere seems to
work. For example, if I change the file to the following:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; lexical-bug.el --- lexical bug -*- lexical-binding: t; -*-
(setq lexical-binding nil) ; 1
(eval-when-compile
(let (lexical-binding) ; 2
(defmacro test-ptr (x)
(let (lexical-binding ; 3
)
`(let* (lexical-binding ; 4
(ptr (copy-tree ,x))
(form '(setcar ptr 'a))
(result (eval form)))
(message "result is %s, ptr is %s" result ptr))))))
(eval-when-compile (setq lexical-binding nil)) ; 5
(setq lexical-binding nil) ; 6
(test-ptr '(x y z))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
, I still get an error with `ptr' being unbound.
What is going on here? Why is the byte compiler continuing to use
lexical binding despite the variable being set to nil in six different
ways?
What do I have to do to get `ptr' in this context a special variable
(whilst still having it lexically bound in other code)?
--
Alan Mackenzie (Nuremberg, Germany).
next reply other threads:[~2015-04-13 22:03 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-13 22:03 Alan Mackenzie [this message]
2015-04-13 22:19 ` Trouble with lexical-binding Philipp Stephani
2015-04-14 14:03 ` Alan Mackenzie
2015-04-14 16:53 ` Stefan Monnier
2015-04-15 13:44 ` Alan Mackenzie
2015-04-15 14:34 ` Stefan Monnier
2015-04-13 22:28 ` Stefan Monnier
2015-04-15 13:48 ` Nicolas Richard
2015-04-15 14:44 ` Stefan Monnier
2015-04-16 17:34 ` Nicolas Richard
2015-04-16 18:43 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150413220317.GC6324@acm.fritz.box \
--to=acm@muc.de \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.