slot-value は盲点だったは、ありがとう。
環境の状態を、関数の引数に渡していく方法でゲームを作ってて、
毎回コピーしてから値の更新するのが面倒だったんだよね

大体こんな感じ↓
(defun battle (player enemy)
(battle (move player 1 2)
(attack player enemy)))
(defun attack (a b)
(update-struct b
:hp (- (player-hp b)
(player-attack a))))
(defun move (s x y)
(let ((pos-x (pos-x (player-pos s)))
(pos-y (pos-y (player-pos s))))
(update-struct s
:pos (make-pos :x (+ pos-x x)
:y (+ pos-y y)))))

; update-struct を使用しない場合
(defun attack (a b)
(let ((copy-b (copy-player b)))
(setf (player-hp b)
(- (player-hp b)
(player-attack a)))))