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