What it means is the every cons cell in the source is not referenced but made fresh in the result. Everything not cons is just referenced.
Yes numbers are immutable, but low numbers that fit in a pointer is not actually an object since the data is encoded in the address. In any case the "pointer address" in the car
and cdr
is just copied onto a new cons
in copy-tree
as long as it's not itself a cons cell.
copy-list
is the same except it only does fresh cons for cdr
and not for additional structure in car
. It's just referenced even when it's just cons.