% acl Allegro CL 3.0.1.beta [sun4] (12/12/90 11:16) Copyright (C) 1985-1988, Franz Inc., Berkeley, CA, USA > (defun test1 (x) (test2)) TEST1 > (defun test2 () (print x)) TEST2 > (test1 2) Error: Attempt to take the value of the unbound symbol X [1] > :resetというように,変数xはtest1の関数の局所変数でtest2の定義内部までのスコー プを持たない.そのため,関数test2の本体を実行する際のxは大域変数と扱 われるが,今の場合大域変数xは値を持たないためにunboundエラーが起こる. そこで,次にdefvarによりxをスペシャル変数として宣言してtest1を呼ぶと,
> (defvar x 10) X > (test1 2) 2 2 > x 10となる.ここで注意しなければならないのは,test1の引数 x はスペシャ ル変数であるために動的バィンディングが起こる.そのためxの値は2に一 端なるが,その関数から抜けでるとその値との結合を解除しxは元の値 (10)に戻る. 処理系全体でスペシャル変数を宣言するのではなく,関数の内部で局所的に スペシャル宣言をするための方法もある.declare を使う. 以下のようにtest3の引数であるyという変数をその本体の内部でスペシャルで ある(動的バインディングを行なうように)と宣言すれば,test4の中の変数y は動的バインディングされた値を利用してtest3の引数の値を用いることが出 来るようになる.
> (defun test3 (y) (declare (special y)) (test4)) test3 >(defun test4 () (print y)) test4 > y *** - EVAL: variable Y has no value 1. Break > :uw > (test3 2) 2 2 [27]> (test4) *** - EVAL: variable Y has no value 1. Break > :uw [29]> y *** - EVAL: variable Y has no value 1. Break > :uwこのようにtest3の実行後にはyの値はもとにもどりunboundになっている.