unofficial mirror of emacs-tangents@gnu.org
 help / color / mirror / Atom feed
From: Nicolas Richard <youngfrog@members.fsf.org>
To: Rolf Ade <rolf@pointsman.de>
Cc: emacs-tangents@gnu.org
Subject: Re: 2016-05-23 Emacs News
Date: Fri, 10 Jun 2016 12:30:23 +0200	[thread overview]
Message-ID: <87twh1gwu8.fsf@members.fsf.org> (raw)
In-Reply-To: <87bn39ewp6.fsf@linux-qg7d.fritz.box>

Rolf Ade <rolf@pointsman.de> writes:
> (That is:
> http://mbork.pl/2016-05-23_Literal_values_and_destructive_functions)
>
> Wait, what?
>
> Sure, sort is documented as modifying the LIST in place. And the setq
> makes `foo` global, so ... maybe no surprise, or so. But if I eval
>
> (defun destructive-havoc ()
>   "Example of destructive havoc."
>   (let ((foo '(1 3 2)))
>         (message "before sort, foo is: %s" foo)
>         (sort foo #'<)
>         (message "after sort, foo is: %s" foo)))
>
> and M-: (destructive-havoc) two times, I still get
>
> before sort, foo is: (1 3 2)
> after sort, foo is: (1 2 3)
> before sort, foo is: (1 2 3)
> after sort, foo is: (1 2 3)
>
> in *Messages*. Could someone please explain that to me?

The article you're referring to explains just that. Is it somehow
unclear ? Quoting the article:

| What’s going on?
| 
| Well, the literal in the function definition was actually changed. (If
| you evaluate the defun form now, it will be redefined once again to
| the “correct” value.) If you don’t believe it, try this: M-:
| (symbol-function #'destructive-havoc), or even better, M-x
| pp-eval-expression RET (symbol-function #'destructive-havoc) RET and
| see for yourself.

Btw it's even more impressive (imho) if you start from '(3 2 1) :

(defun destructive-havoc ()
  "Example of destructive havoc."
  (let ((foo '(3 2 1)))
        (message "before sort, foo is: %s" foo)
        (sort foo #'<)
        (message "after sort, foo is: %s" foo)))

calling it twice gives :

before sort, foo is: (3 2 1)
after sort, foo is: (3)
before sort, foo is: (3)
after sort, foo is: (3)

-- 
Nicolas



  reply	other threads:[~2016-06-10 10:30 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-23 16:44 2016-05-23 Emacs News Sacha Chua
2016-06-10  0:04 ` Rolf Ade
2016-06-10 10:30   ` Nicolas Richard [this message]
2016-06-10 13:37     ` Rolf Ade
2016-06-10 13:52       ` Marcin Borkowski
2016-06-10 15:22         ` Rolf Ade
2016-06-10 16:45           ` John Mastro
2016-06-10 14:55       ` Nicolas Richard
2016-06-10 16:01         ` Rolf Ade

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

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87twh1gwu8.fsf@members.fsf.org \
    --to=youngfrog@members.fsf.org \
    --cc=emacs-tangents@gnu.org \
    --cc=rolf@pointsman.de \
    /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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).