psetq — 병렬로 변수에 값 할당
psetq — 병렬로 변수에 값 할당
여러 변수에 값을 한꺼번에, 서로의 새 값을 간섭 없이 넣고 싶을 때가 있어요. setq는 왼쪽에서 오른쪽으로 순차 할당하지만, psetq는 매크로로 모든 폼을 먼저 평가한 뒤 값을 병렬로 할당해요.
시그니처
psetq {pair}* => nil
pair::= var form
본문
인자와 값
var— 상수 변수가 아닌 변수를 가리키는 심볼이에요.form— 폼이에요.
설명
변수에 값을 할당해요.
setq와 같지만, 할당이 병렬로 일어난다는 점만 달라요. 즉 모든 form을 먼저 평가하고, 그다음에야 변수들을 결과 값으로 설정해요. 이렇게 하면 어떤 변수에 대한 할당이 다른 변수의 값 계산에 영향을 주지 않아요 — setq의 순차 할당과는 다르죠.
어떤 var가 symbol-macrolet에 의해 만들어진 바인딩을 가리킨다면, 그 var는 psetf(가 아니라 psetq)가 쓰인 것처럼 취급돼요.
예제
;; A simple use of PSETQ to establish values for variables.
;; As a matter of style, many programmers would prefer SETQ
;; in a simple situation like this where parallel assignment
;; is not needed, but the two have equivalent effect.
(psetq a 1 b 2 c 3) => NIL
a => 1
b => 2
c => 3
;; Use of PSETQ to update values by parallel assignment.
;; The effect here is very different than if SETQ had been used.
(psetq a (1+ b) b (1+ a) c (+ a b)) => NIL
a => 3
b => 2
c => 3
;; Use of PSETQ on a symbol macro.
(let ((x (list 10 20 30)))
(symbol-macrolet ((y (car x)) (z (cadr x)))
(psetq y (1+ z) z (1+ y))
(list x y z)))
=> ((21 11 30) 21 11)
;; Use of parallel assignment to swap values of A and B.
(let ((a 1) (b 2))
(psetq a b b a)
(values a b))
=> 2, 1
Side Effects
forms의 값이 vars에 할당돼요.
더 알아보기
psetf— place 병렬 할당setq— 순차 할당