From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: sunway Newsgroups: gmane.emacs.help Subject: Re: when should a variable to quoted? Date: Sat, 13 Sep 2008 04:06:31 -0700 (PDT) Organization: http://groups.google.com Message-ID: <48f57bb9-232f-4c11-9639-50b071cb06af@b30g2000prf.googlegroups.com> References: <5bdb1b73-bf04-49a3-8629-61d32ef6f899@p31g2000prf.googlegroups.com> <87k5dg9yid.fsf@hubble.informatimago.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Trace: ger.gmane.org 1221306045 21969 80.91.229.12 (13 Sep 2008 11:40:45 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 13 Sep 2008 11:40:45 +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 Sep 13 13:41:40 2008 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1KeTVU-0004zz-0c for geh-help-gnu-emacs@m.gmane.org; Sat, 13 Sep 2008 13:41:40 +0200 Original-Received: from localhost ([127.0.0.1]:59064 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KeTUT-0003us-Pr for geh-help-gnu-emacs@m.gmane.org; Sat, 13 Sep 2008 07:40:37 -0400 Original-Path: news.stanford.edu!newsfeed.stanford.edu!postnews.google.com!b30g2000prf.googlegroups.com!not-for-mail Original-Newsgroups: gnu.emacs.help Original-Lines: 108 Original-NNTP-Posting-Host: 123.127.134.57 Original-X-Trace: posting.google.com 1221303991 31972 127.0.0.1 (13 Sep 2008 11:06:31 GMT) Original-X-Complaints-To: groups-abuse@google.com Original-NNTP-Posting-Date: Sat, 13 Sep 2008 11:06:31 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: b30g2000prf.googlegroups.com; posting-host=123.127.134.57; posting-account=ngAdqwoAAAA0uK1OfC15kE5UvDiCOvxy User-Agent: G2/1.0 X-HTTP-UserAgent: Opera/9.51 (X11; Linux i686; U; zh-cn),gzip(gfe),gzip(gfe) X-HTTP-Via: 1.0 localhost.localdomain:8080 (squid/2.6.STABLE18) Original-Xref: news.stanford.edu gnu.emacs.help:162180 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:57524 Archived-At: "elisp lacks of lexical variable", if this happens to the C programming language: int a=3D10; foo(a); may be "a" will be changed to 9 ? if so, I really hate this feature.... On Sep 13, 5:38=A0pm, p...@informatimago.com (Pascal J. Bourguignon) wrote: > sunway writes: > > (add-to-list 'll "a") > > (delete-dups ll) > > > The variable "ll" needs be quoted in add-to-list, while not quoted in > > delete-dups, why? any special reasons? > > Lisp passes its arguments by-value. > > Therefore a function cannot modify the variables from which the values > it gets come. > > It still can modify the value, when it is mutable, but not the variable. > > Usually, when we want to have a variable (or in general, a place) > modified, we have to use a macro, or a special operator. > > (setq ll (list 1 2 3)) ; setq is a special operator. > (require 'cl) > (push 0 ll) =A0 =A0 =A0 =A0 =A0 =A0; push is a macro > > Otherwise, you must take care to get the result and store it back into > the variable: > > (setq ll (delete ll 2)) ; delete modifies the value of ll, and returns > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ; the modified value, but= when it's the first > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ; element that is deleted= , we need to modify > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ; the variable too. > > For some reason (probably historical), emacs lisp authors prefer to > use a function add-to-list instead of a macro push. =A0Because there is > no lexical variable in emacs lisp, but only special variables, where > the value of the variable is always stored inside the symbol, in the > symbol-value slot, we can consider any symbol to be a "pointer" to the > variable. Therefore it is possible to pass a symbol to a function that > will modify its symbol-value, thus modifying the variable named by > this symbol. =A0In lisp with lexical variables such as scheme or Common > Lisp, it wouldn't work. > > In the case of delete-dups, it's like in the case of delete, but since > it can never reduce to an empty list if passed an non empty list, it > can modify the value in such a way that the variable always points to > the right value. =A0Namely, delete-dups modifies the first cons cell of > the list it gets. > > Delete doesn't take this special step, so when you delete the first > elements, the result returned and the value of the variable are not > the same cons cell: > > (let ((list (list 1 1 2 2 3 3))) > =A0 (print (delete 1 list)) > =A0 list) > prints: =A0(2 2 3 3) > returns: (1 1 2 2 3 3) > > We could try to write delete so it modifies the first cons cell: > > (defun smart-delete (item list) > =A0 =A0(let* ((first-cell list) > =A0 =A0 =A0 =A0 =A0 (head (cons nil list)) > =A0 =A0 =A0 =A0 =A0 (list head)) > =A0 =A0 =A0(while (cdr list) > =A0 =A0 =A0 =A0(if (equal item (cadr list)) > =A0 =A0 =A0 =A0 =A0 (setf (cdr list) (cddr list)) > =A0 =A0 =A0 =A0 =A0 (setf list (cdr list)))) > =A0 =A0 =A0(if (null (cdr head)) > =A0 =A0 =A0 =A0 =A0nil > =A0 =A0 =A0 =A0 =A0(progn (setf (car first-cell) (cadr head) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (cdr first-cell) (cddr head)) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 first-cell)))) > > (let ((list (list 1 1 2 2 1 3 3))) > =A0 (print (smart-delete 1 list)) > =A0 list) > prints: =A0(2 2 3 3) > returns: (2 2 3 3) > > But this wouldn't work when emptying the list: > (let ((list (list 1 1 1))) > =A0 (print (smart-delete 1 list)) > =A0 list) > prints: =A0nil > returns: (1 1 1) > > because there is no way of modifying a cons cell to make it the symbol > nil. > > -- > __Pascal Bourguignon__ =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0http://www.= informatimago.com/ > > ATTENTION: Despite any other listing of product contents found > herein, the consumer is advised that, in actuality, this product > consists of 99.9999999999% empty space.