Pointing to the last element

The final question is, what happens if the `kill-ring-yank-pointer` is set to the last element of the kill ring? Will a call to `rotate-yank-pointer` mean that nothing more can be taken from the kill ring? The answer is no. What happens is different and useful. The `kill-ring-yank-pointer` is set to point to the beginning of the kill ring instead.

Let's see how this works by looking at the code, assuming the length of the kill ring is 5 and the argument passed to `rotate-yank-pointer` is 1. When the `kill-ring-yank-pointer` points to the last element of the kill ring, its length is 1. The code looks like this:

```(% (+ arg (- length (length kill-ring-yank-pointer))) length)
```

When the variables are replaced by their numeric values, the expression looks like this:

```(% (+ 1 (- 5 1)) 5)
```

This expression can be evaluated by looking at the most embedded inner expression first and working outwards: The value of `(- 5 1)` is 4; the sum of `(+ 1 4)` is 5; and the remainder of dividing 5 by 5 is zero. So what `rotate-yank-pointer` will do is

```(setq kill-ring-yank-pointer (nthcdr 0 kill-ring))
```

which will set the `kill-ring-yank-pointer` to point to the beginning of the kill ring.

So what happens with successive calls to `rotate-yank-pointer` is that it moves the `kill-ring-yank-pointer` from element to element in the kill ring until it reaches the end; then it jumps back to the beginning. And this is why the kill ring is called a ring, since by jumping back to the beginning, it is as if the list has no end! (And what is a ring, but an entity with no end?)