A proper list is () (the empty list, aka nil ) or a pair where the cdr is a proper list. Any chain of pairs where the last one has () as it's cdr is a proper list (in addition to the empty list itself).
A dotted list is a pair that does not have a proper list as it's cdr . Thus a chain of pairs where the last cdr is not () matches this.
;; dotted lists (cons 1 2) ; ==> (1 . 2) (cons 1 (cons 2 3)) ; ==> (1 2 . 3) or (1 . (2 . 3)) ;; proper lists (cons 1 '()) ; ==> (1) or (1 . ()) (cons 1 (cons 2 '())) ; ==> (1 2) or (1 . (2 . ()))
append is a procedure that uses cons to make a list with all the elements of the argument lists left to right. A common implementation of append for just two lists would be:
(define (append lst tail) (if (null? lst) tail (cons (car lst) (append (cdr lst) tail))))
append will fail if one of the arguments except the last is not a proper list. Tail and can be any value:
(append '(1 2 3) '(4 5)) ; ==> (1 2 3 4 5) or (1 . (2 . (3 . (4 . (5 . ()))))) (append '(1 2 3) '(4 5 . 6)) ; ==> (1 2 3 4 5 . 6) or (1 . (2 . (3 . (4 . (5 . 6))))) (append '(1 2 3) #f) ; ==> (1 2 3 . #f) or (1 . (2 . (3 . #f))) (append '(1 2 . 3) '(4 5 . 6)) ; ==> error `car` of number not allowed