Exercise 1.4.6
More CAR and CDR
cons
, car
and cdr
are purely functional. Which means they never mutate their arguments.
* (defvar *a* (cons 1 2))
*A*
* *a*
(1 . 2)
* (cdr *a*)
2
* *a*
(1 . 2)
* (cons 3 (cdr *a*))
(3 . 2)
* *a*
(1 . 2)
It is an error to use car
and cdr
on something other than a Cons-Cell.
* (car 1)
; Evaluation aborted on #<TYPE-ERROR expected-type: LIST datum: 1>
* (cdr 'a)
; Evaluation aborted on #<TYPE-ERROR expected-type: LIST datum: A>.
This includes other compound values such as strings and vectors
* (car "a")
; Evaluation aborted on #<TYPE-ERROR expected-type: LIST datum: "a">.
* (cdr #(1 2))
; Evaluation aborted on #<TYPE-ERROR expected-type: LIST datum: #<(SIMPLE-VECTOR 2) {1007D4C76F}>>.
but not the empty list, also represented as NIL
* (car nil)
NIL
* (cdr nil)
NIL
* (car ())
NIL
* (cdr ())
NIL