shiftf | Macro |

**Syntax****shiftf**{`place`}^{+}newvalue → old-value-1**Arguments and Values**`place`— a*place*.`newvalue`— a*form*; evaluated.**Description****shiftf**modifies the values of each`place`by storing`newvalue`into the last`place`, and shifting the values of the second through the last`place`into the remaining`places`.If

`newvalue`produces more values than there are store variables, the extra values are ignored. If`newvalue`produces fewer values than there are store variables, the missing values are set to**nil**.In the form (shiftf

*place1*...*place2**placen*), the values in*newvalue*through*place1*are*placen**read*and saved, andis evaluated, for a total of*newvalue*`n`

+1 values in all. Values 2 through`n`

+1 are then stored intothrough*place1*, respectively. It is as if all the*placen*`places`form a shift register; the`newvalue`is shifted in from the right, all values shift over to the left one place, and the value shifted out ofis returned.*place1*For information about the

*evaluation*of*subforms*of`places`, see Section 5.1.1.1 (Evaluation of Subforms to Places).**Examples**(setq x (list 1 2 3) y 'trash) → TRASH (shiftf y x (cdr x) '(hi there)) → TRASH x → (2 3) y → (1 HI THERE) (setq x (list 'a 'b 'c)) → (A B C) (shiftf (cadr x) 'z) → B x → (A Z C) (shiftf (cadr x) (cddr x) 'q) → Z x → (A (C) . Q) (setq n 0) → 0 (setq x (list 'a 'b 'c 'd)) → (A B C D) (shiftf (nth (setq n (+ n 1)) x) 'z) → B x → (A Z C D)

**Affected By****See Also****Notes**The effect of

`(shiftf`

is roughly equivalent to`place1``place2`...`placen``newvalue`)(let ((var1

`place1`) (var2`place2`) ... (varn`placen`) (var0`newvalue`)) (setf`place1`var2) (setf`place2`var3) ... (setf`placen`var0) var1)except that the latter would evaluate any

*subforms*of each`place`

twice, whereas**shiftf**evaluates them once. For example,(setq n 0) → 0 (setq x (list 'a 'b 'c 'd)) → (A B C D) (prog1 (nth (setq n (+ n 1)) x) (setf (nth (setq n (+ n 1)) x) 'z)) → B x → (A B Z D)