www.delorie.com/gnu/docs/elisp-manual-21/elisp_54.html   search  
Buy the book!

GNU Emacs Lisp Reference Manual

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.5 Read Syntax for Circular Objects

In Emacs 21, to represent shared or circular structure within a complex of Lisp objects, you can use the reader constructs `#n=' and `#n#'.

Use #n= before an object to label it for later reference; subsequently, you can use #n# to refer the same object in another place. Here, n is some integer. For example, here is how to make a list in which the first element recurs as the third element:

(#1=(a) b #1#)

This differs from ordinary syntax such as this

((a) b (a))

which would result in a list whose first and third elements look alike but are not the same Lisp object. This shows the difference:

(prog1 nil
  (setq x '(#1=(a) b #1#)))
(eq (nth 0 x) (nth 2 x))
     => t
(setq x '((a) b (a)))
(eq (nth 0 x) (nth 2 x))
     => nil

You can also use the same syntax to make a circular structure, which appears as an "element" within itself. Here is an example:

#1=(a #1#)

This makes a list whose second element is the list itself. Here's how you can see that it really works:

(prog1 nil
  (setq x '#1=(a #1#)))
(eq x (cadr x))
     => t

The Lisp printer can produce this syntax to record circular and shared structure in a Lisp object, if you bind the variable print-circle to a non-nil value. See section 19.6 Variables Affecting Output.

  webmaster   donations   bookstore     delorie software   privacy  
  Copyright 2003   by The Free Software Foundation     Updated Jun 2003