psetq — 병렬로 변수에 값 할당

psetq — 병렬로 변수에 값 할당

여러 변수에 값을 한꺼번에, 서로의 새 값을 간섭 없이 넣고 싶을 때가 있어요. setq는 왼쪽에서 오른쪽으로 순차 할당하지만, psetq매크로로 모든 폼을 먼저 평가한 뒤 값을 병렬로 할당해요.

출처: PSETQ - Common Lisp HyperSpec

시그니처

psetq {pair}* => nil

pair::= var form

본문

인자와 값

  • var상수 변수가 아닌 변수를 가리키는 심볼이에요.
  • form이에요.

설명

변수에 값을 할당해요.

setq와 같지만, 할당이 병렬로 일어난다는 점만 달라요. 즉 모든 form을 먼저 평가하고, 그다음에야 변수들을 결과 값으로 설정해요. 이렇게 하면 어떤 변수에 대한 할당이 다른 변수의 값 계산에 영향을 주지 않아요 — setq의 순차 할당과는 다르죠.

어떤 varsymbol-macrolet에 의해 만들어진 바인딩을 가리킨다면, 그 varpsetf(가 아니라 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 — 순차 할당