rotatef — place들의 값을 한 칸씩 회전
rotatef — place들의 값을 한 칸씩 회전
여러 place의 값들을 서로 한 칸씩 밀어 돌리고 싶을 때가 있어요. rotatef는 매크로로, place들의 값을 회전시켜 각 place가 다음 place의 값을 갖게 해요.
시그니처
rotatef place* => nil
본문
인자와 값
place— place예요.
설명
각 place의 값을 다른 place로 회전시켜서 값을 수정해요.
어떤 place가 저장 변수(store variable)보다 많은 값을 만들어 내면 초과 값은 무시돼요. 반대로 저장 변수보다 적은 값을 만들어 내면 빠진 값은 nil로 설정돼요.
(rotatef place1 place2...placen) 폼에서 place1부터 placen까지의 값이 읽히고 쓰여져요. 그다음 2번째부터 n번째까지의 값과 1번째 값이 place1부터 placen까지에 저장돼요. 마치 모든 place가 한 칸 왼쪽으로 회전하는 엔드어라운드(end-around) 쉬프트 레지스터이고, place1의 값이 끝을 돌아 placen으로 가는 것처럼 동작해요.
places의 부분 폼(subform) 평가에 대한 내용은 Section 5.1.1.1 (Evaluation of Subforms to Places)을 참고하세요.
예제
(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)
Affected By
없음.
Notes
(rotatef place1 place2 ... placen)의 효과는 다음 코드와 대략 같아요:
(psetf place1 place2
place2 place3
...
placen place1)
다만 후자는 각 place의 부분 폼들을 두 번 평가하는 반면, rotatef는 한 번만 평가해요.
더 알아보기
define-setf-expander,defsetf— place 확장 정의setf,shiftf— place 값 설정·이동*macroexpand-hook*- Section 5.1 (Generalized Reference) — 일반화된 참조