all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Michael Heerdegen <michael_heerdegen@web.de>
To: help-gnu-emacs@gnu.org
Subject: Re: how to add button to emacs that play a elisp code
Date: Fri, 12 Sep 2014 03:19:05 +0200	[thread overview]
Message-ID: <878ulp8wl2.fsf@web.de> (raw)
In-Reply-To: 87wq99u0g1.fsf@debian.uxu

Emanuel Berg <embe8573@student.uu.se> writes:

> How common this pitfall is in Lisp one has to wonder
> though... do you have an example?

Using quoted lists in your program, you may get a mysteriously
self-modifying behavior:


(defun 1-2-rest (&rest elements)
  "Return a list of 1, 2 and the ELEMENTS."
  (nconc '(1 2) elements))

(1-2-rest 3)
  ==> (1 2 3)

(1-2-rest 'a)
  ==> (1 2 3 a)    ;; Oops!


This happens because the list '(1 2) is constructed by the lisp reader,
and the resulting object becomes part of your program.  Compiling isn't
involved, btw.


OTOH:

(defun 1-2-rest (&rest elements)
  "Return a list of 1, 2 and the ELEMENTS."
  (nconc (list 1 2) elements))

(1-2-rest 3)
  ==> (1 2 3)

(1-2-rest 'a)
  ==> (1 2 a)    ;; Better!

Now, the list (1 2) is constructed at run-time.  This definition leads
to a quite different program.


You may argue that you can avoid destructive operations like `nconc' in
your code to prevent that problem.  But that isn't enough either: when
you pass your list to some function you didn't define yourself (e.g. a
function that is part of Emacs), it is passed as reference (as usual in
Lisp), and it may be modified by that function by side effect, so that
your program "changes" too.

If you are not aware of that problem, it probably won't bite you often,
but when it does, you'll need a lot of time to find out what's actually
going on.

BTW, this "effect" can also be used constructively, it's not "harmful"
per se.


Michael.




  reply	other threads:[~2014-09-12  1:19 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-11  7:44 how to add button to emacs that play a elisp code Renato Pontefice
2014-09-11  8:08 ` Gian Uberto Lauri
2014-09-11  8:40   ` Gian Uberto Lauri
2014-09-11 12:17     ` Stefan Monnier
2014-09-11 12:22       ` Gian Uberto Lauri
2014-09-11 12:35         ` Stefan Monnier
2014-09-11 12:46           ` Gian Uberto Lauri
     [not found]         ` <mailman.8685.1410439222.1147.help-gnu-emacs@gnu.org>
2014-09-11 21:15           ` Emanuel Berg
2014-09-11 23:42             ` Pascal J. Bourguignon
2014-09-12  0:05               ` Emanuel Berg
2014-09-12  0:23                 ` Michael Heerdegen
     [not found]                 ` <mailman.8717.1410481417.1147.help-gnu-emacs@gnu.org>
2014-09-12  0:50                   ` Emanuel Berg
2014-09-12  1:19                     ` Michael Heerdegen [this message]
2014-09-12 14:52                       ` Drew Adams
     [not found]                     ` <mailman.8719.1410484774.1147.help-gnu-emacs@gnu.org>
2014-09-12  2:07                       ` Emanuel Berg
2014-09-12  7:44                         ` Renato Pontefice
2014-09-12 10:15                           ` Renato Pontefice
2014-09-12 19:33                             ` Emanuel Berg
2014-09-13 21:28                 ` Pascal J. Bourguignon
2014-09-14  2:30                   ` Rusi
2014-09-14  4:18                     ` Rusi
2014-09-14 18:16                     ` Emanuel Berg
2014-09-14 18:11                   ` Emanuel Berg
2014-09-15  5:48                     ` Alex Kost
     [not found]                     ` <mailman.8874.1410760111.1147.help-gnu-emacs@gnu.org>
2014-09-15 22:45                       ` Emanuel Berg
2014-09-16  4:55                         ` Alex Kost
     [not found]                         ` <mailman.8956.1410843332.1147.help-gnu-emacs@gnu.org>
2014-09-16 22:27                           ` Emanuel Berg
     [not found]   ` <mailman.8671.1410424828.1147.help-gnu-emacs@gnu.org>
2014-09-11 21:06     ` Emanuel Berg
     [not found] ` <mailman.8670.1410422963.1147.help-gnu-emacs@gnu.org>
2014-09-11  8:24   ` Renato Pontefice
2014-09-11 16:00 ` Pascal J. Bourguignon

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=878ulp8wl2.fsf@web.de \
    --to=michael_heerdegen@web.de \
    --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.