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: add-to-list with lexical variables Date: Sat, 08 Jun 2013 16:34:49 -0400 Message-ID: References: <87txl8u68b.fsf@gmail.com> <87r4gcln2h.fsf@kuiper.lan.informatimago.com> <874nd8hbox.fsf@gmail.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1370723719 30502 80.91.229.3 (8 Jun 2013 20:35:19 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 8 Jun 2013 20:35:19 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Sat Jun 08 22:35:19 2013 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 1UlPr4-0004L8-TE for geh-help-gnu-emacs@m.gmane.org; Sat, 08 Jun 2013 22:35:19 +0200 Original-Received: from localhost ([::1]:55503 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UlPr4-0002Cm-Hj for geh-help-gnu-emacs@m.gmane.org; Sat, 08 Jun 2013 16:35:18 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:45462) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UlPqq-0002BF-0C for help-gnu-emacs@gnu.org; Sat, 08 Jun 2013 16:35:05 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UlPqp-0005YG-4K for help-gnu-emacs@gnu.org; Sat, 08 Jun 2013 16:35:03 -0400 Original-Received: from plane.gmane.org ([80.91.229.3]:48140) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UlPqo-0005VW-Ue for help-gnu-emacs@gnu.org; Sat, 08 Jun 2013 16:35:03 -0400 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1UlPqn-0004AY-ON for help-gnu-emacs@gnu.org; Sat, 08 Jun 2013 22:35:01 +0200 Original-Received: from 69-165-139-76.dsl.teksavvy.com ([69.165.139.76]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sat, 08 Jun 2013 22:35:01 +0200 Original-Received: from monnier by 69-165-139-76.dsl.teksavvy.com with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sat, 08 Jun 2013 22:35:01 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 32 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 69-165-139-76.dsl.teksavvy.com User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux) Cancel-Lock: sha1:O42eVErBwQF7ldPFL2DvGAFuBvc= 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.14 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-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:91402 Archived-At: >>> 1. when I set `lexical-binding' to t and byte-compile the file, it >>> would report this error: >>> >>> add-to-list cannot use lexical var `env-list' add-to-list is a function, and functions have access to the dynamically-bound vars of its caller, but not to the lexically-bound vars of its caller. The warning was added because add-to-list is a frequent use-case where Elisp code presumes dynamic binding. >>> 2. And when I using `lexical-let*' instead, there would be an warning: >>> >>> Warning: assignment to free variable `env-list' lexical-let is an old way to get lexical binding. It was added long before add-to-list was invented, and it was only used at those few places where people really wanted lexical binding, and those people generally knew that add-to-list couldn't possibly work there, so the use of add-to-list on a var bound with lexical-let was so rare that it didn't occur to anybody to try and provide an ad-hoc check and warning. instead it just notices that the call to `add-to-list' uses a (dynamic) variable `env-list' which is not declared (i.e. is "free"). > However I still don't know the difference `lexical-binding' and > `lexical-let' brings. Are there some authoritative introductions/tutorials? lexical-let is an old hack made obsolete by lexical-binding. Stefan