The Pair
class represents a scheme pair. It consists of a
Car
and a Cdr
field, which can
both be any type of object. As far as Scheme itself is concerned, this is
all there is to a pair.
However, a scheme pair has a few properties that can be better exposed via
.NET interfaces. Consequently, the Pair
implements the
IList
, allowing it to be used in many circumstances
where a .NET list class can be. There are some 'oddities' related to the
slightly differing nature of a Pair to a 'standard' .NET list which may
limit the usefulness of these functions.
Improper lists are not .NET lists. For convienience, no error is generated unless the 'improper' element is accessed, however, so improper lists may be useful in some circumstances. Neither are self-referential lists: these do not produce errors but may result in infinite loops in some cases.
The .NET list interface is designed on the assumption that the 'list' is
contained by the class and is not (as in the case of Pairs) the class
itself. This means that it is not sensible to remove the only element
in a scheme list containing a single value. The .NET 'null' value
represents an empty list, and the scheme specification states that
an empty list is not a Pair. Use myPair = myPair.Cdr
as code
to remove the first element in a list wherever you possibly can.
Normally removing (or inserting) an element will just result in an elements Cdr being changed, but this is not always possible, so some operations will result in an element being overwritten. In particular, inserting or removing at the beginning of a Pair list will result in the first element being overwritten with the new value. The consequences are subtle, but may be significant in some circumstances.
Consequences of removing parts of a Pair
Given the pair (1 2 3)
, stored in the object somePair
,
the result of somePair.Remove(1)
is that somePair.Cdr is changed
to point to (3)
(the tail of the pair). somePair.Cdr.Remove(0)
however, has a new effect. It changes the pair representing (2 3)
(the Cdr of pair) with the pair (3)
. somePair.Cdr
is NOT changed, but instead its value is modified.
Pairs can be constructed from any object implementing the ICollection interface. This produces a well-formed scheme list from the contents of the collection.