Gauche:parameter
「パラメータは状態を保持する手段として、単なるグローバル変数に比べていくつかの利点を持っています。」
もちょっとの具体例で理解するページ。
- パラメータの値はスレッド毎に保持されるので、パラメータをスレッドローカルな格納領域として利用することができます。新たに作られたスレッドは、その作成元のスレッドのパラメータのコピーを受け取ります。
- CGIプログラムの場合は、グローバル変数とパラメータは同じ?
- cgiかどうかは関係なく、スレッドを使ってなければ実質的に
同じですかね。
- パラメータに値がセットされるときに、指定の「フィルタ手続き」を呼んで値を検査することができます。これにより、パラメータの値が常に正当なものであることを保証できます。
- マクロparameterizeにより、特定のダイナミックスコープの中だけパラメータの値を変えることができます。これは、実質的にダイナミックスコープを持つ変数を置き換えることができます。
- 伝統的なダイナミック変数のかわりに使えます。
例えば、賢いprintルーチンを書いたとしましょう。
与えた幅に従ってインデントや改行を適当に入れてみやすくしてくれるとか、
あらかじめ設定した長さ以上のツリーは"..." で省略するとか、
数値の基底を変えて16進数で全部書くようにカスタマイズできるとか。
そういうカスタマイズパラメータが増えるにつれ、それを引数として
渡すのは厄介になります。エントリポイントの関数はまあキーワード引数を
取るようにしておくとしても、実装の中での小さな末端の関数にまで
それらの引数を受け渡して行くのは厄介なばかりです。
(更に、他人の作った関数がprintを呼んでいる場合、自分が望む引数を
printに渡すことさえできないかもしれません)。
こんな時に、伝統的なLispでは
カスタマイズパラメータをダイナミック変数にしておいて、
変更が必要なものだけ動的に束縛する、ということがよく行われます。
- また、パラメータの値が変更されたときに呼ばれるコールバック手続きを登録しておくこともできます。これによって実質的に、いわゆる「traceされた変数」を置き換えることができます。
- parameter-observer-add! とかを使って変数へのアクセスカウンタを回せるとかそういったことでは?cut-sea:2004/06/21 20:46:03 PDT
Last modified : 2004/06/22 06:30:18 UTC