RFR: 7057785 : (xs) Add note to hashCode() that support for self referential is optional

Guy Steele guy.steele at oracle.com
Thu Aug 29 02:10:29 UTC 2013

What Mike said.  It's basically the same problem as for serialization,
so you keep a hashtable of all objects traversed---but you need not record
objects that have no subobjects and have "simple" or "short" printed representations
(such as numbers and maybe short strings).

In full generality it requires two traversals.  Then as you format each object
on the second traversal, objects encountered more than once can be given
labels on first occurrence and references on later occurrences.  Common Lisp
uses "#nnn=" for labels and "#nnn# for references, for integers nnn, so a list
containing three occurrences of the same sublist as well as two self-references
and the symbol BAZ might print in this way:

  #1=(#1# #2=(a b c) #2# #1# BAZ #2#)

Common Lisp has a global (dynamically scoped) variable *print-circle* that
controls whether to use the circularity-detection algorithm.


On Aug 28, 2013, at 6:54 PM, Alan Eliasen <eliasen at mindspring.com> wrote:

> On 08/28/2013 04:47 PM, Guy Steele wrote:
>> <oldfogey> *ahem* Y'know, Common Lisp had a good solution for
>> printing self-referential structures (by a user-extensible print
>> function) back in 1984.
>> It leaned on the solution that had been provided in Interlisp in
>> 1974.  On a machine with one megabyte of main memory and a speed of 1
>> MIPS.
>> This is not rocket science. </oldfogey>
>   Hehe.  So could you please describe the solution?
> -- 
>  Alan Eliasen
>  eliasen at mindspring.com
>  http://futureboy.us/

More information about the core-libs-dev mailing list