Exercise 1.4.17
Circular Lists
The destructive equivalent of append
is nconc
. Using such side-effects, it's possible to create circular lists.
* (defparameter *cycle* (list 'a 'b))
*CYCLE*
* (first *cycle*)
A
* (second *cycle*)
B
* (third *cycle*)
NIL
* (fourth *cycle*)
NIL
Before we create an actual cycle, we need to tell the interpreter to print them (otherwise the request to print a circular list would never return; unlike Haskell, Common Lisp is not a lazy language by default).
* (setf *print-circle* t)
T
* (nconc *cycle* *cycle*)
#1=(A B . #1#)
* (third *cycle*)
A
* (fourth *cycle*)
B
* (loop repeat 15 for elem in *cycle* collect elem)
(A B A B A B A B A B A B A B A)