読者です 読者をやめる 読者になる 読者になる

きくらげ観察日記

好きなことを、適当に。

Gaucheでパラメータを定義する

Gauche

Gaucheには、グローバル変数の代わりに使用できるパラメータというオブジェクトが存在します。

パラメータの作成

(define x (make-parameter 3))
(x)     ; => 3
(x 100) ; xの値を100に設定
(x)     ; => 100

典型的な使い方としては、特定の関数が使用するデフォルトの値を設定する場合などに使えます。

(define (my-make-vector) (make-vector (default-length)))
(my-make-vector) ; => 要素10個からなるvector

(default-length 1)
(my-make-vector) ; => 要素1個からなるvector

パラメータの値のフィルタリング

パラメータが取る値に制限を設けたい場合、make-parameterの第二引数にフィルターのようなものを指定できます。

(define default-length
  (make-parameter 10 (^(size)
                       ;; sizeが0以下なら1をセットする
                       (if (<= size 0) 1 size))))
(default-length)   ; => 10
(default-length 5)
(default-length)   ; => 5
(default-length 0)
(default-length)   ; => 1

パラメータの値の変化の監視

parameter-observer-add!を使うことで、パラメータに値がセットされる直前/された直後に特定の関数を実行することができるようになります。

(default-length 10)
(parameter-observer-add! default-length
                         (^(old new)
                           (print #"old: ~old, new: ~new"))
                         'before)
(default-length 3)
;; => old: 10, new: 3

局所的なパラメータの値の変更

また、局所的にパラメータの値を変更することもできます。

(default-length 10)

(parameterize ((default-length 5))
  ;; この中身を実行している時だけ(default-length)が5となる
  (my-make-vector)) ; => 要素5個のvector

(default-length) ; => 10