
Also, updates some of the mzlib files to point at `racket/*' libraries rather than to `scheme/*' ones.
117 lines
3.4 KiB
Racket
117 lines
3.4 KiB
Racket
#lang scribble/doc
|
|
@(require scribble/manual scribble/eval "guide-utils.rkt")
|
|
|
|
@title[#:tag "pairs"]{Pairs and Lists}
|
|
|
|
A @deftech{pair} joins two arbitrary values. The @racket[cons]
|
|
procedure constructs pairs, and the @racket[car] and @racket[cdr]
|
|
procedures extract the first and second elements of the pair,
|
|
respectively. The @racket[pair?] predicate recognizes pairs.
|
|
|
|
Some pairs print by wrapping parentheses around the printed forms of
|
|
the two pair elements, putting a @litchar{'} at the beginning and a
|
|
@litchar{.} between the elements.
|
|
|
|
@examples[
|
|
(cons 1 2)
|
|
(cons (cons 1 2) 3)
|
|
(car (cons 1 2))
|
|
(cdr (cons 1 2))
|
|
(pair? (cons 1 2))
|
|
]
|
|
|
|
A @deftech{list} is a combination of pairs that creates a linked
|
|
list. More precisely, a list is either the empty list @racket[null],
|
|
or it is a pair whose first element is a list element and whose second
|
|
element is a list. The @racket[list?] predicate recognizes lists. The
|
|
@racket[null?] predicate recognizes the empty list.
|
|
|
|
A list normally prints as a @litchar{'} followed by a pair of parentheses
|
|
wrapped around the list elements.
|
|
|
|
@examples[
|
|
null
|
|
(cons 0 (cons 1 (cons 2 null)))
|
|
(list? null)
|
|
(list? (cons 1 (cons 2 null)))
|
|
(list? (cons 1 2))
|
|
]
|
|
|
|
A list or pair prints using @racketresult[list] or @racketresult[cons]
|
|
when one of its elements cannot be written as a @racket[quote]d
|
|
value. For example, a value constructed with @racket[srcloc] cannot be
|
|
written using @racket[quote], and it prints using @racketresult[srcloc]:
|
|
|
|
@interaction[
|
|
(srcloc "file.rkt" 1 0 1 (+ 4 4))
|
|
(list 'here (srcloc "file.rkt" 1 0 1 8) 'there)
|
|
(cons 1 (srcloc "file.rkt" 1 0 1 8))
|
|
(cons 1 (cons 2 (srcloc "file.rkt" 1 0 1 8)))
|
|
]
|
|
|
|
@margin-note{See also @racket[list*].}
|
|
|
|
As shown in the last example, @racketresult[list*] is used to
|
|
abbreviate a series of @racketresult[cons]es that cannot be
|
|
abbreviated using @racketresult[list].
|
|
|
|
The @racket[write] and @racket[display] functions print a pair or list
|
|
without a leading @litchar{'}, @racketresult[cons],
|
|
@racketresult[list], or @racketresult[list*]. There is no difference
|
|
between @racket[write] and @racket[display] for a pair or list, except
|
|
as they apply to elements of the list:
|
|
|
|
@examples[
|
|
(write (cons 1 2))
|
|
(display (cons 1 2))
|
|
(write null)
|
|
(display null)
|
|
(write (list 1 2 "3"))
|
|
(display (list 1 2 "3"))
|
|
]
|
|
|
|
Among the most important predefined procedures on lists are those that
|
|
iterate through the list's elements:
|
|
|
|
@interaction[
|
|
(map (lambda (i) (/ 1 i))
|
|
'(1 2 3))
|
|
(andmap (lambda (i) (i . < . 3))
|
|
'(1 2 3))
|
|
(ormap (lambda (i) (i . < . 3))
|
|
'(1 2 3))
|
|
(filter (lambda (i) (i . < . 3))
|
|
'(1 2 3))
|
|
(foldl (lambda (v i) (+ v i))
|
|
10
|
|
'(1 2 3))
|
|
(for-each (lambda (i) (display i))
|
|
'(1 2 3))
|
|
(member "Keys"
|
|
'("Florida" "Keys" "U.S.A."))
|
|
(assoc 'where
|
|
'((when "3:30") (where "Florida") (who "Mickey")))
|
|
]
|
|
|
|
@refdetails["pairs"]{pairs and lists}
|
|
|
|
Pairs are immutable (contrary to Lisp tradition), and @racket[pair?]
|
|
and @racket[list?] recognize immutable pairs and lists, only. The
|
|
@racket[mcons] procedure creates a @deftech{mutable pair}, which works
|
|
with @racket[set-mcar!] and @racket[set-mcdr!], as well as
|
|
@racket[mcar] and @racket[mcdr]. A mutable pair prints using
|
|
@racketresult[mcons], while @racket[write] and @racket[display] print
|
|
mutable pairs with @litchar["{"] and @litchar["}"]:
|
|
|
|
@examples[
|
|
(define p (mcons 1 2))
|
|
p
|
|
(pair? p)
|
|
(mpair? p)
|
|
(set-mcar! p 0)
|
|
p
|
|
(write p)
|
|
]
|
|
|
|
@refdetails["mpairs"]{mutable pairs}
|