help-gnu-emacs
[Top][All Lists]
Advanced

[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 {}.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]