common lispにおけるスコープの考察

(setf x 'outside)
;=>outside

;letはparallelに値を束縛する.
(let ((x 'inside)
	  (y x)) ;x => outside
  (list x y))
;=>(inside outside)


;let*は逐次値を束縛する.
(let* ((x 'inside)
	   (y x)) ;x => inside
  (list x y))
;=>(inside inside)
(list y)
;=>(outside) ;束縛から解放される.
;-------------------------------------------------------------------------

(setf y 'outside)
(let ((x 'inside)
	  (y x)) ;letはparallelに値を束縛するので,この段階ではxは定義されていない.
  (list x y))
;=>変数が定義されていません: x
(setf y '(1 2 3))
;=>(1 2 3)
(let ((x '10))
  (setf y x)
  (list x y))
;=>(10 10)
y
;=>10

;-----------------------------------------------

(setf y '(1 2 3))
;=>(1 2 3)
(let ((x '10)) ;xはlexical scope
  (rplaca y x) ;破壊的関数でyを書き換える.xを引数にとっていることに注意.
  (list x y))
;=>(10 (10 2 3))
(list y) 
;=>((10 2 3)) ;yはcar部が10に書き換えられた状態で値を返す.