elisp: Circular Objects

 
 2.5 Read Syntax for Circular Objects
 ====================================
 
 To represent shared or circular structures 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.  SeeOutput Variables.