1 Welcome to PLT Scheme
2 Scheme Essentials
3 Built-In Datatypes
4 Expressions and Definitions
5 Programmer-Defined Datatypes
6 Modules
7 Contracts
8 Input and Output
9 Regular Expressions
10 Exceptions and Control
11 Iterations and Comprehensions
12 Pattern Matching
13 Classes and Objects
14 Units (Components)
15 Reflection and Dynamic Evaluation
16 Macros
17 Performance
18 Running and Creating Executables
19 Compilation and Configuration
20 More Libraries
Bibliography
Index
Version: 4.0.2

 

3.8 Pairs and Lists

A pair joins two arbitrary values. The cons procedure constructs pairs, and the car and cdr procedures extract the first and second elements of the pair, respectively. The pair? predicate recognizes pairs.

Some pairs print by wrapping parentheses around the printed forms of the two pair elements, putting a . between them.

Examples:

  > (cons 1 2)

  (1 . 2)

  > (cons (cons 1 2) 3)

  ((1 . 2) . 3)

  > (car (cons 1 2))

  1

  > (cdr (cons 1 2))

  2

  > (pair? (cons 1 2))

  #t

A list is a combination of pairs that creates a linked list. More precisely, a list is either the empty list null, or it is a pair whose first element is a list element and whose second element is a list. The list? predicate recognizes lists. The null? predicate recognizes the empty list.

A list prints as a pair of parentheses wrapped around the list elements.

Examples:

  > null

  ()

  > (cons 0 (cons 1 (cons 2 null)))

  (0 1 2)

  > (list? null)

  #t

  > (list? (cons 1 (cons 2 null)))

  #t

  > (list? (cons 1 2))

  #f

An expression with ' followed by the printed form of a pair or list produces a pair or list constant.

Examples:

  > '()

  ()

  > '(1 . 2)

  (1 . 2)

  > '(1 2 3)

  (1 2 3)

Pairs are immutable (contrary to Lisp tradition), and pair? and list? recognize immutable pairs and lists, only. The mcons procedure creates a mutable pair, which works with set-mcar! and set-mcdr!, as well as mcar and mcdr.

Examples:

  > (define p (mcons 1 2))

  > p

  {1 . 2}

  > (pair? p)

  #f

  > (mpair? p)

  #t

  > (set-mcar! p 0)

  > p

  {0 . 2}

Among the most important predefined procedures on lists are those that iterate through the list’s elements:

  > (map (lambda (i) (/ 1 i))

         '(1 2 3))

  (1 1/2 1/3)

  > (andmap (lambda (i) (i . < . 3))

           '(1 2 3))

  #f

  > (ormap (lambda (i) (i . < . 3))

           '(1 2 3))

  #t

  > (filter (lambda (i) (i . < . 3))

            '(1 2 3))

  (1 2)

  > (foldl (lambda (v i) (+ v i))

           10

           '(1 2 3))

  16

  > (for-each (lambda (i) (display i))

              '(1 2 3))

  123

  > (member "Keys"

            '("Florida" "Keys" "U.S.A."))

  ("Keys" "U.S.A.")

  > (assoc 'where

           '((when "3:30") (where "Florida") (who "Mickey")))

  (where "Florida")

Pairs and Lists in Reference: PLT Scheme provides more on pairs and lists.