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に書き換えられた状態で値を返す.