[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: About Circular Objects
From: |
Pascal J. Bourguignon |
Subject: |
Re: About Circular Objects |
Date: |
Tue, 25 Dec 2012 15:51:48 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.2 (gnu/linux) |
Xue Fuqiao <xfq.free@gmail.com> writes:
> I have a question about the #N# read syntax and #N= syntax. Look at this
> code:
>
> (progn
> (setq x '#1=(a #1#))
> (eq x (cdr x)))
>
> Why does this code return nil? Isn't the second element the list itself?
No. Try it. (use M-x ielm).
*** Welcome to IELM *** Type (describe-mode) for help.
ELISP> (setq x '#1=(a #1#))
#1=(a #1#)
ELISP> x
#1=(a #1#)
ELISP> (cdr x)
#1=((a . #1#))
ELISP> (eq x (second x))
t
ELISP> (eq x (cadr x))
t
ELISP> (eq x (cdr x))
nil
ELISP>
If you want (eq x (cdr x)), then write:
(setq x '#1=(a . #1#))
instead of:
(setq x '#1=(a #1#))
ELISP> (setq x '#1=(a . #1#))
#1=(a . #1#)
ELISP> (eq x (cdr x))
t
ELISP>
Not all circular structures are circular lists. Even circular lists may
have a stem:
ELISP> (let ((circle '#1=(a . #1#)))
(setq x (list* 'a 'a 'a circle)))
(a a a . #1=(a . #1#))
ELISP> x
(a a a . #1=(a . #1#))
ELISP> (eq (car x) (cadr x))
t
ELISP> (eq (cadr x) (caddr x))
t
ELISP> (eq (caddr x) (cadddr x))
t
and so on ad libitum, but:
ELISP> (eq x (cdr x))
nil
ELISP>
--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.