Macro ROTATEF
rotatef place* => nil
place - place
rotatefは、あるplaceから他のものへ値の回転をすることで、 各placeを修正します。
もしnewvalueが格納変数より多い値を生成したときは、余分な値は無視されます。 もしnewvalueが格納変数より少ない値しか生成しなかったときは、 値のないものはnilがセットされます。
フォームが(rotatef place1 place2 ... placen newvalue)のとき、 place1~placenまでの値を読み込み書き込まれます。 2~n個目の値は、それぞれplace1~placenに格納されます。
それは全てplaceフォームが、 終端が周期的になっているシフトレジスタであるかのように扱われます。 それは各placeが左へひとつ回転され、 place1の値は周期的に終わりの方であるplacenへシフトされます。
placeのサブフォームの評価については、5.1.1.1. placeのサブフォームの評価をご確認ください。
(let ((n 0)
(x (list 'a 'b 'c 'd 'e 'f 'g)))
(rotatef (nth (incf n) x)
(nth (incf n) x)
(nth (incf n) x))
x) => (A C D B E F G)なし。
なし。
define-setf-expander, defsetf, setf, shiftf, *macroexpand-hook*, 5.1. 一般化された参照
(rotatef place1 place2 ... placen newvalue)の効果は、だいたい次と同等です。
(psetf place1 place2
place2 place3
...
placen place1)ただし、これは各placeのサブフォームを2度評価していますが、 rotatefはただ一度だけです。