Node: Conses, Next: , Previous: Lists, Up: Lists



Conses

As mentioned in the preceding section conses can serve as fundamental building blocks of lists, association lists, dotted lists, trees and sets. A single cons is created with the cons function.

cons x y Function

The cons function returns a new cons whose car is x and cdr is y. For example:

     cons(S(a), S(b)) => (a . b)
     cons(S(a), list(S(b), S(c), S(d))) => (a b c d)
     

The accessors of a cons are the car and cdr functions. The car and cdr of a cons can be set with the rplaca (replace car) and rplacd (replace cdr) functions.

car list Function

This returns the car of list which must be either a cons or nil. The car of nil returns nil. For example:

     car(cons(S(a), S(b))) => a
     car(list(L(1), L(2), L(3))) => 1
     

cdr list Function

This returns the cdr of list which must be either a cons or nil. The cdr of nil returns nil. For example:

     cdr(cons(S(a), S(b))) => b
     cdr(list(L(1), L(2), L(3))) => (2 3)
     

caar cons Function

cadr cons Function

cdar cons Function

cddr cons Function

These functions are a convenience but also are important as commonly passed function objects. They perform successive car and or cdr operations of the cons argument cons and are defined by the following equivalents

     caar(x) == car(car(x))
     cadr(x) == car(cdr(x))
     cdar(x) == cdr(car(x))
     cddr(x) == cdr(cdr(x))
     

rplaca x y Function

The argument x must be a cons and y can be any Lpp object. This changes the car of x to y and returns the cons x after it has been modified. For example:

     let c = cons(L(1), L(2));
     rplaca(c, S(a)) => (a . 2)
     c = list(S(a), S(b), S(c));
     rplaca(c, L(1)) => (1 b c)
     

rplacd x y Function

The argument x must be a cons and y can be any Lpp object. This changes the cdr of x to y and returns the cons x after it has been modified. For example:

     let c = cons(L(1), L(2));
     rplacd(c, S(a)) => (1 . a)
     rplacd(c, list(L(2), L(3))) => (1 2 3)