From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.help Subject: Re: `pp-eval-expression' behaves strangely under lexical binding Date: Mon, 18 Apr 2016 11:58:09 -0400 Message-ID: References: <87pototkq5.fsf@mbork.pl> <87mvostie1.fsf@mbork.pl> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: ger.gmane.org 1460995126 5916 80.91.229.3 (18 Apr 2016 15:58:46 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 18 Apr 2016 15:58:46 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Mon Apr 18 17:58:38 2016 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1asBZN-0001ug-Mn for geh-help-gnu-emacs@m.gmane.org; Mon, 18 Apr 2016 17:58:37 +0200 Original-Received: from localhost ([::1]:40264 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1asBZN-00067b-8B for geh-help-gnu-emacs@m.gmane.org; Mon, 18 Apr 2016 11:58:37 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:54825) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1asBZA-00064Q-Kq for help-gnu-emacs@gnu.org; Mon, 18 Apr 2016 11:58:25 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1asBZ4-0003Pd-8e for help-gnu-emacs@gnu.org; Mon, 18 Apr 2016 11:58:24 -0400 Original-Received: from plane.gmane.org ([80.91.229.3]:45689) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1asBZ4-0003PN-24 for help-gnu-emacs@gnu.org; Mon, 18 Apr 2016 11:58:18 -0400 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1asBZ2-0001kx-Rf for help-gnu-emacs@gnu.org; Mon, 18 Apr 2016 17:58:17 +0200 Original-Received: from 45.72.141.36 ([45.72.141.36]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 18 Apr 2016 17:58:16 +0200 Original-Received: from monnier by 45.72.141.36 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Mon, 18 Apr 2016 17:58:16 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 55 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 45.72.141.36 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) Cancel-Lock: sha1:YdYa2ED4kpUOwT6xdZm6rpjZtOg= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 80.91.229.3 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "help-gnu-emacs" Xref: news.gmane.org gmane.emacs.help:109787 Archived-At: >>> 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 (( 1)) (foo 'a (+ 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 (( 1)) (foo (+ 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