Re: LIST-LENGTH & circular lists hjstein@xxxxxx 22 Feb 1999 19:35 UTC
Olin Shivers <xxxxxx@mongkok.ai.mit.edu> writes: > From: Doug Currie <xxxxxx@flavors.com> If we accept Olin's > proposition that "Everything is a list (Or: When you've got a > hammer...)" then everything should have a list length. So, I > ammend my suggestion above to say: Extend list-length so it > terminates on circular-lists, returning 0 for anything which is > a circular-list (isn't a proper-list or a dotted-list). > > The first half strikes me as a sensible proposal: extend LENGTH so > it is required to terminate on every possible Scheme value. > > But defining the length of an infinite list to be 0 is not such a > good idea, I think. The length of () is 0. The length of "foo" is > 0. The length of a circular list ain't 0! It's infinite. The notion > of "length" is connected to the number of times you can apply CDR > to the value, which is 0 times for () and unbounded for a circular > list. Alternatively, the length of a list as the number of elements in the list, in which case a circular list has a finite length. It's also probably a lot more useful to have length return the number of elements in a circular list than some special value indicating that the list is circular. If one's working with circular lists a lot I'd expect that wanting to know the size of the different lists would be more common than just wanting to know whether or not the lists are circular. Returning a special value for circular lists makes length useless for circular lists - it degenerates to circular? on this subclass of lists, which doesn't seem to be good design. It's also more consistent with (a b . c) and (a b) having length 2. If the last cdr points back to the head why should the length be different than the (a b . c) case? Finally, what about lists that aren't completely circular - ones whose last cdr points into themselves? Or were you thinking of these too when you said "circular lists"? So, I'm strongly in favor of a generalized length = number of elements, not = number of possible cdrs. However, I don't think a generalized length is such a good idea. It implies a substantial amount of additional overhead on computing the length of a list. This overhead remains no matter what you return for circular lists - it's the act of detecting them which adds the overhead. To summarize, I'm in favor of a length fcn which goes into an infinite loop on circular lists, but if you're going to include a generalized length fcn I think the length of a circular list should be the number of elements in the list, not any special value. -- Harvey J. Stein BFM Financial Research xxxxxx@bfr.co.il