From: Paul Pogonyshev <pogonyshev@gmail.com>
To: 55137@debbugs.gnu.org
Subject: bug#55137: Different result when interpreted and when evaluating byte-compiled code
Date: Wed, 27 Apr 2022 00:16:42 +0200 [thread overview]
Message-ID: <CAG7BpaqmWCYjdqDwQYZubgkYQdJH39wuh123+3G1P5oVhb5fJg@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 2269 bytes --]
I'm not absolutely sure if it is a bug or a "feature", but it is
extremely confusing.
To reproduce: store this as file `test.el':
(defvar special-variable nil)
(defmacro is-special-as-macro ()
(special-variable-p 'special-variable))
(defun is-special-as-function ()
(is-special-as-macro))
(print (is-special-as-function))
(print (eval '(is-special-as-macro)))
Now, from command line:
$ rm -f test.elc; emacs --batch -l test.el
This loads the file as interpreted Elisp and prints `t' two times,
i.e. always recognizes the variable as special.
Next, byte-compile the file before loading:
$ rm -f test.elc; emacs --batch --eval "(byte-compile-file
\"test.el\")"; emacs --batch -l test.elc
This prints `nil' and `t', i.e. variable is now considered non-special
by `is-special-as-function'. From investigating `.elc' file, it is
apparent that this is encoded into it as a macroexpanded constant.
Note that `is-special-as-macro' still works fine, the problem appears
only when it gets macroexpanded during byte-compilation.
So, apparently `defvar' form is sort of "skipped without paying
attention" during byte-compilation. If I put it into an
`eval-and-compile' form, then macroexpansion does produce expected
result.
I noticed this with code using `iter2' library. When `iter2-defun'
generator functions get macroexpanded during compilation, built-in
`special-variable-p' is called, because for generator functions this
is important to distinguish between local and dynamic variables. The
example above is derived from debugging real failure.
Standard `generator' package is also affected. Here is example code:
;;; -*- lexical-binding: t -*-
(require 'generator)
(defvar special-variable nil)
(defun get-special-variable ()
special-variable)
(iter-defun buggy ()
(let ((special-variable t))
(iter-yield (get-special-variable))))
(print (iter-next (buggy)))
As before, save as `test.el' and execute the same two commands.
Produced output is different depending on whether the file has been
byte-compiled or not.
Is `eval-and-compile' the proper workaround? Can things be made less
confusing by noticing declared special variables during
byte-compilation?
Paul
[-- Attachment #2: Type: text/html, Size: 2677 bytes --]
next reply other threads:[~2022-04-26 22:16 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-26 22:16 Paul Pogonyshev [this message]
2022-04-27 2:27 ` bug#55137: Different result when interpreted and when evaluating byte-compiled code Eli Zaretskii
2022-04-27 9:19 ` Paul Pogonyshev
2022-04-27 11:20 ` Phil Sainty
2022-04-27 11:33 ` Paul Pogonyshev
2022-11-08 2:37 ` Michael Heerdegen
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=CAG7BpaqmWCYjdqDwQYZubgkYQdJH39wuh123+3G1P5oVhb5fJg@mail.gmail.com \
--to=pogonyshev@gmail.com \
--cc=55137@debbugs.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.