Pairs and Lists
9.1 Pairs and Lists
(cons 1 2) ; (1 . 2): a pair
(car (cons 1 2)) ; 1
(cdr (cons 1 2)) ; 2
(cons 1 '()) ; (1)
(cons 1 (cons 2 (cons 3 '()))) ; (1 2 3): a proper list
(list 1 2 3) ; (1 2 3)
'(1 2 3) ; (1 2 3) (a literal: don't mutate)
(cons 1 '(2 3)) ; (1 2 3)
(cons '(1 2) '(3)) ; ((1 2) 3)
'(1 2 . 3) ; an improper list
(1 2 3): [1|•]→[2|•]→[3|()]
9.2 List Operations (R7RS base)
(car '(a b c)) (cdr '(a b c)) ; a (b c)
(cadr '(a b c)) (caddr '(a b c)) ; b c
(null? '()) ; #t
(pair? '(1)) ; #t
(list? '(1 2)) (list? '(1 . 2)) ; #t #f
(length '(1 2 3)) ; 3
(append '(1 2) '(3) '(4 5)) ; (1 2 3 4 5)
(reverse '(1 2 3)) ; (3 2 1)
(list-tail '(a b c d) 2) ; (c d)
(list-ref '(a b c) 1) ; b
(list-copy '(1 2 3))
(make-list 3 'x) ; (x x x)
(memq 'c '(a b c d)) ; (c d)
(member "b" '("a" "b")) ; ("b")
(memv 2 '(1 2 3)) ; (2 3)
(member 2.0 '(1 2 3) =) ; (2 3) (R7RS: custom comparator)
(assq 'b '((a 1) (b 2))) ; (b 2)
(assoc "b" '(("a" . 1) ("b" . 2))) ; ("b" . 2)
(map + '(1 2) '(10 20)) ; (11 22)
(for-each display '(1 2 3)) ; prints 123
(list->vector '(1 2)) (vector->list #(1 2))
(list->string '(#\a)) (string->list "ab")
9.3 Mutation
(define lst (list 1 2 3)) ; LIST creates a fresh, mutable list
(set-car! lst 100) ; lst = (100 2 3)
(set-cdr! (cddr lst) '(4)) ; lst = (100 2 3 4)
;; Never mutate quoted literals: (set-car! '(1 2) 9) is an error