all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: help-gnu-emacs@gnu.org
Subject: Re: `pp-eval-expression' behaves strangely under lexical binding
Date: Mon, 18 Apr 2016 11:58:09 -0400	[thread overview]
Message-ID: <jwvh9eyapem.fsf-monnier+gmane.emacs.help@gnu.org> (raw)
In-Reply-To: vz1k2jvnefn.fsf@gmail.com

>>> But isn't my question still valid for `symbol-value'?
>> No, whether it's implemented in C or in Lisp is irrelevant.  As soon as
>> you put a symbol into a `quote`, it can't be a reference to a lexical
>> variable any more because the compiler will treat it as data and data
>> cannot refer to lexical variables, only to other data.
>> Dynamically scoped variables are data, on the other hand (they're just
>> a particular field of a symbol object, which is a kind of "struct").
> This short description is very helpful. Could you add some similar wording
> to the elisp manual to help clarify usage of lexical binding ?

I don't really see how/where to put it in the manual, sadly.
If you give me a sample patch, I promise I'll try to improve it ;-)


        Stefan


PS: Another way to look at those issues is from the "α-renaming" point
of view.  A lexical variable's name should have no impact on the code,
in the sense that the compiler should be able to rename it or get rid of
the name (and indeed Emacs's Elisp compiler gets rid of the lexical
variables's names).  So the compiler can take

    (let ((a 1))
      (foo 'a (+ a 1)))

and treat it as if you had written

    (let ((b 1))
      (foo 'a (+ b 1)))

or even

    (let ((<noname> 1))
      (foo 'a (+ <the-last-var-defined> 1)))

But clearly, it can treat it as if you had written

    (let ((b 1))
      (foo 'b (+ b 1)))

[ Unless maybe the compiler is being told that `foo` takes
  a variable-identifier as first argument.  ]

and even less

    (let ((<noname> 1))
      (foo <reference-to-the-last-var-defined> (+ <the-last-var-defined> 1)))

since `foo` now wouldn't even receive a *symbol* any more but some other
kind of object (lexical variables, at run-time, aren't referenced via
symbols at all).


        Stefan




      reply	other threads:[~2016-04-18 15:58 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-17 13:43 `pp-eval-expression' behaves strangely under lexical binding Marcin Borkowski
2016-04-17 14:33 ` Marcin Borkowski
2016-04-17 16:15   ` Stefan Monnier
2016-04-17 17:42     ` Marcin Borkowski
2016-04-18 15:07     ` Andy Moreton
2016-04-18 15:58       ` Stefan Monnier [this message]

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=jwvh9eyapem.fsf-monnier+gmane.emacs.help@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=help-gnu-emacs@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.