For Gauche 0.9.5


Next: , Previous: , Up: ライブラリモジュール - Gauche拡張モジュール   [Contents][Index]

9.21 gauche.parameter - パラメータ

Module: gauche.parameter

「パラメータ」は基本的にゼロもしくは一個の引数を取る状態を持つ手続きとみなせます。 引数が与えられなかった場合、それは内部に保持した値を返します。 一つの引数が与えられた場合、その値が新たなパラメータ内部の値となり、 変更前の値が返されます。 パラメータは状態を保持する手段として、 単なるグローバル変数に比べていくつかの利点を持っています。

パラメータの値はスレッド毎に保持されるので、 パラメータをスレッドローカルな格納領域として利用することができます。 新たに作られたスレッドは、その作成元のスレッドのパラメータのコピーを 受け取ります。

パラメータに値がセットされるときに、指定の「フィルタ手続き」を呼んで 値を検査することができます。これにより、パラメータの値が常に正当なもので あることを保証できます。

マクロparameterizeにより、特定のダイナミックスコープの中だけ パラメータの値を変えることができます。これは、実質的にダイナミックスコープを 持つ変数を置き換えることができます。

また、パラメータの値が変更されたときに呼ばれるコールバック手続きを 登録しておくこともできます。これによって実質的に、いわゆる 「traceされた変数」を置き換えることができます。

パラメータオブジェクトの基本的な機能はSRFI-39で定義されています。 この機能はまた、ChezScheme、Chicken、MzSchemeなどいくつかのScheme処理系に 見られます。GaucheのパラメータはSRFI-39の上位互換になっています。

Class: <parameter>

パラメータのクラスです。object-applyメソッドが定義されているので、 パラメータオブジェクトは普通の手続きと同様に使うことが出来ます。

;; p is a parameter with initial value 2
(define p (make-parameter 2))

;; calling p with no arguments returns the current value
(p) ⇒ 2

;; modify p's value to 3
(p 3)

(p) ⇒ 3

;; you can also use generalized set (srfi-17)
(set! (p) 5)

(p) ⇒ 5

;; using parameterize dynamically changes p's value.

(define (get-p) (p))

(parameterize ([p 7])
  (get-p)) ⇒ 7

(get-p)    ⇒ 5
Function: make-parameter value :optional filter

[SRFI-39] 初期値がvalueであるパラメータを作成します。 もし省略可能な引数filterが与えられた場合、 それは一つの引数を取る手続きでなければなりません。 パラメータの値が変更されようとした時、filterは与えられた値を 引数として呼ばれ、filterが返した値がパラメータの新しい値と なります。filterはエラーを報告したりパラメータの値を変えずに置くことも 可能です。

Macro: parameterize ((param value) …) body …

[SRFI-39] body …を評価します。 但し、body … の実行中のみ、パラメータparamの値を valueに変更します。最後bodyの返した値を返します。

例:

(define a (make-parameter 1))
(a) ⇒ 1
(a 2) ⇒ 1
(a) ⇒ 2
(parameterize ((a 3))
  (a)) ⇒ 3
(a) ⇒ 2
Method: parameter-observer-add! (p <parameter>) proc :optional when where

procをパラメータpの“オブザーバ”手続きに追加します。 オブザーバ手続きは、(1)パラメータに新しい値がセットされる直前、 あるいは(2)パラメータに新しい値がセットされた直後、に呼ばれます。 (1)の場合、コールバックが呼ばれる前にフィルタ手続きがすでに適用 されています。どちらの場合も、オブザーバ手続きは、古い値と新しい 値の2引数を伴って呼ばれます。オブザーバ手続きの戻り値は無視されます。

オプショナル引数whenは、シンボルbeforeafterの いずれかでなければならず、値が変更された前と後のどちらでprocが 呼ばれるかを指定します。省略されると、afterを指定したものと されます。

オプショナル引数whereは、シンボルappendprependの いずれかでなければならず、procが既存のオブザーバ手続きのリストの 前に追加されるか後に追加されるかを指定します。省略されると、append を指定したものとされます。

注意: パラメータの値自身がスレッドローカルであっても、 オブザーバのリストは全てのスレッドで共有されます。

Method: parameter-observer-delete! (p <parameter>) proc :optional when

パラメータpのオブザーバ手続きのリストからprocを削除します。 procがリストになければ、何も起こりません。 when引数にシンボルbeforeafterを与えて、 procをどちらのリストから削除するかを指定することができます。 when引数が省略されると、procは両方のリストから削除されます。

Method: parameter-pre-observers (p <parameter>)
Method: parameter-post-observers (p <parameter>)

“before”か“after”オブザーバをそれぞれキープするフックオブジェクト (フック参照)を返します。

注意: パラメータの値自身がスレッドローカルであっても、 オブザーバのリストは全てのスレッドで共有されます。


Next: , Previous: , Up: ライブラリモジュール - Gauche拡張モジュール   [Contents][Index]