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)
(list 'a 'b 'c 'd 'e 'f 'g)))
(x (rotatef (nth (incf n) x)
(nth (incf n) x)
(nth (incf n) x))
(=> (A C D B E F G) x)
なし。
なし。
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
はただ一度だけです。