unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* 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).