| www.delorie.com/gnu/docs/guile/guile_120.html | search |
![]() Buy GNU books! | |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Pairs are the essential building block of list structure in Scheme. A pair object has two fields, called the car and the cdr.
It is conventional for a pair's CAR to contain an element of a
list, and the CDR to point to the next pair in the list, or to
contain SCM_EOL, indicating the end of the list. Thus, a set of
pairs chained through their CDRs constitutes a singly-linked list.
Scheme and libguile define many functions which operate on lists
constructed in this fashion, so although lists chained through the
CARs of pairs will work fine too, they may be less convenient to
manipulate, and receive less support from the community.
Guile implements pairs by mapping the CAR and CDR of a pair directly into the two words of the cell.
This is the most primitive way to allocate a cell; it is quite fast.
The CAR of the cell initially tags it as a "free cell". If the caller intends to use it as an ordinary cons, she must store ordinary SCM values in its CAR and CDR.
If the caller intends to use it as a header for some other type, she
must store an appropriate magic value in the cell's CAR, to mark
it as a member of that type, and store whatever value in the CDR
that type expects. You should generally not do this, unless you are
implementing a new datatype, and thoroughly understand the code in
<libguile/tags.h>.
The macros below perform no type checking. The results are undefined if cell is an immediate. However, since all non-immediate Guile objects are constructed from cells, and these macros simply return the first element of a cell, they actually can be useful on datatypes other than pairs. (Of course, it is not very modular to use them outside of the code which implements that datatype.)
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| webmaster donations bookstore | delorie software privacy |
| Copyright © 2003 by The Free Software Foundation | Updated Jun 2003 |