* bug#11258: 24.1.50; lexical binding inconsistencies
@ 2012-04-16 20:03 Michael Heerdegen
2012-04-17 17:58 ` Stefan Monnier
0 siblings, 1 reply; 5+ messages in thread
From: Michael Heerdegen @ 2012-04-16 20:03 UTC (permalink / raw)
To: 11258
Hi,
I have an elisp file with this content:
; Test -*- lexical-binding: t -*-
(defun test1 (arg)
(interactive "i")
(funcall (lambda () arg)))
(defun test2 (arg)
(interactive "i")
((lambda () arg)))
;; (test1 nil)
;; (test2 nil)
I visit the file and do M-x eval-buffer. Then I do the following:
1(a) Put point after (test1 nil) and hit C-x C-e: nil
1(b) M-x test1: nil
2(a) Put point after (test2 nil) and hit C-x C-e
If I had loaded my .emacs before, I get nil
With emacs -Q, I get: Lisp error: (void-variable arg)
2(b) M-x test2: Lisp error: (void-variable arg)
Now, byte compile the file, and load the compiled code. Now, repeat
the above four tests. You always get nil, and no error.
That's strange - shouldn't the result always be nil? If not, this
(surprising) behavior should be documented in the manual.
I've experimented a lot, and found that the results for 2(a) are not
always the same.
OTOH, the compiled code always works as expected (result nil).
Regards,
Michael.
In GNU Emacs 24.1.50.1 (i486-pc-linux-gnu, GTK+ Version 3.2.3)
of 2012-04-10 on zelenka, modified by Debian
(emacs-snapshot package, version 2:20120410-1)
Windowing system distributor `The X.Org Foundation', version 11.0.11104000
Configured using:
`configure '--build' 'i486-linux-gnu' '--host' 'i486-linux-gnu'
'--prefix=/usr' '--sharedstatedir=/var/lib' '--libexecdir=/usr/lib'
'--localstatedir=/var' '--infodir=/usr/share/info'
'--mandir=/usr/share/man' '--with-pop=yes'
'--enable-locallisppath=/etc/emacs-snapshot:/etc/emacs:/usr/local/share/emacs/24.1.50/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/24.1.50/site-lisp:/usr/share/emacs/site-lisp'
'--without-compress-info' '--with-crt-dir=/usr/lib/i386-linux-gnu/'
'--with-x=yes' '--with-x-toolkit=gtk3' '--with-imagemagick=yes'
'build_alias=i486-linux-gnu' 'host_alias=i486-linux-gnu'
'CFLAGS=-DDEBIAN -DSITELOAD_PURESIZE_EXTRA=5000 -g -O2''
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#11258: 24.1.50; lexical binding inconsistencies
2012-04-16 20:03 bug#11258: 24.1.50; lexical binding inconsistencies Michael Heerdegen
@ 2012-04-17 17:58 ` Stefan Monnier
2012-04-18 1:03 ` Michael Heerdegen
2013-04-19 20:50 ` Michael Heerdegen
0 siblings, 2 replies; 5+ messages in thread
From: Stefan Monnier @ 2012-04-17 17:58 UTC (permalink / raw)
To: michael_heerdegen; +Cc: 11258
> ; Test -*- lexical-binding: t -*-
[...]
> (defun test2 (arg)
> (interactive "i")
> ((lambda () arg)))
Yes, this is the inconsistency recently discovered in
emacs-lock-mode, indeed.
> That's strange - shouldn't the result always be nil? If not, this
> (surprising) behavior should be documented in the manual.
This is a bug in the handling of ((lambda ...) args) in lexical-binding:
the compiler treats it as (funcall #'(lambda () ...) args), whereas the
interpreter treats it as (funcall '(lambda () ...) args), so the
lambda's body is treated as lexically scoped when compiled but
dynamically scoped when interpreted.
I think the compiler is right, so the interpreter needs fixing. I'm not
completely sure it will be harmless, so it won't be fixed in 24.1.
Stefan
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#11258: 24.1.50; lexical binding inconsistencies
2012-04-17 17:58 ` Stefan Monnier
@ 2012-04-18 1:03 ` Michael Heerdegen
2013-04-19 20:50 ` Michael Heerdegen
1 sibling, 0 replies; 5+ messages in thread
From: Michael Heerdegen @ 2012-04-18 1:03 UTC (permalink / raw)
To: Stefan Monnier; +Cc: 11258
Stefan Monnier <monnier@IRO.UMontreal.CA> writes:
> > ; Test -*- lexical-binding: t -*-
> > (defun test2 (arg)
> > (interactive "i")
> > ((lambda () arg)))
> This is a bug in the handling of ((lambda ...) args) in lexical-binding:
> the compiler treats it as (funcall #'(lambda () ...) args), whereas the
> interpreter treats it as (funcall '(lambda () ...) args), so the
> lambda's body is treated as lexically scoped when compiled but
> dynamically scoped when interpreted.
There is no scoping at all when interpreted. The dynamical scope is not
established (else, we would get no error), which is right - just the
lexical scope is missing.
> I think the compiler is right, so the interpreter needs fixing. I'm
> not completely sure it will be harmless, so it won't be fixed in 24.1.
Ok.
Regards,
Michael.
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#11258: 24.1.50; lexical binding inconsistencies
2012-04-17 17:58 ` Stefan Monnier
2012-04-18 1:03 ` Michael Heerdegen
@ 2013-04-19 20:50 ` Michael Heerdegen
2013-08-28 18:28 ` Stefan Monnier
1 sibling, 1 reply; 5+ messages in thread
From: Michael Heerdegen @ 2013-04-19 20:50 UTC (permalink / raw)
To: 11258
Stefan Monnier <monnier@IRO.UMontreal.CA> writes:
> I think the compiler is right, so the interpreter needs fixing. I'm not
> completely sure it will be harmless, so it won't be fixed in 24.1.
Testing my recipe today with (emacs-version) => "GNU Emacs 24.3.50.1
(x86_64-pc-linux-gnu, GTK+ Version 3.4.2)\n of 2013-04-10 on dex,
modified by Debian", I see that the behavior is still the same.
Regards,
Michael.
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#11258: 24.1.50; lexical binding inconsistencies
2013-04-19 20:50 ` Michael Heerdegen
@ 2013-08-28 18:28 ` Stefan Monnier
0 siblings, 0 replies; 5+ messages in thread
From: Stefan Monnier @ 2013-08-28 18:28 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: 11258-done
> Testing my recipe today with (emacs-version) => "GNU Emacs 24.3.50.1
> (x86_64-pc-linux-gnu, GTK+ Version 3.4.2)\n of 2013-04-10 on dex,
> modified by Debian", I see that the behavior is still the same.
I installed the trivial patch below, which should fix it. Sorry for
that ridiculous delay.
Stefan
=== modified file 'src/eval.c'
--- src/eval.c 2013-08-12 07:12:07 +0000
+++ src/eval.c 2013-08-28 18:24:19 +0000
@@ -2149,6 +2149,8 @@
if (SYMBOLP (fun) && !NILP (fun)
&& (fun = XSYMBOL (fun)->function, SYMBOLP (fun)))
fun = indirect_function (fun);
+ else
+ fun = Ffunction (Fcons (fun, Qnil));
if (SUBRP (fun))
{
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-08-28 18:28 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-04-16 20:03 bug#11258: 24.1.50; lexical binding inconsistencies Michael Heerdegen
2012-04-17 17:58 ` Stefan Monnier
2012-04-18 1:03 ` Michael Heerdegen
2013-04-19 20:50 ` Michael Heerdegen
2013-08-28 18:28 ` Stefan Monnier
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).