YOSHINO日記

プログラミングに関すること

参照透過性はやぶれ意味は名前ではなく場所を探した

代入と参照透過性

SICPを読んでいる。

(define ( make-withdraw balance )
  ( lambda ( amount )
    (if (>= balance amount )
          (begin (set! balance (- balance amount ))
          balance )
       " Insufficient funds ")))

(define W1 ( make-withdraw 100))

これを環境モデルを使って分析すると以下のようになる。

f:id:taiki44no:20181224235507p:plain
代入と参照透過性に関して

この中でbalance局所変数とよばれる。

balanceは内部状態を保持する。

(W1 20)

を実行するだけ、balanceの値は書き換えられていく。

これを可能にしているのは(内部状態を忘れずに保持できるのは)、W1によってbalanceが定義されている環境が規定されていることにある。

外側の世界に規定されていないものは、存在を維持することはできない。

代入を導入するということは参照透過性を崩すということ

代入を導入し参照透過性を崩すということは、値がそれまで名前によって定義されていたけど(代入によって値が変わらないのであれば名前が値と同等の意味をもつ)、 代入が導入されることで、値は場所によって定義されるようになったということになる(名前が絶対的な値を持つことはなくなった)。

そして、変数が定義されている場所が維持されるためには(内部状態を保持)、他の場所から規定される必要がある。

外側の世界に規定されている必要がある。

一番外側の世界はグローバルの世界ということになる。

こういった話を考えていくと、絶対主義と相対主義の話しに近づいていく。

絶対的な価値観はあるのかとか無いとかそういった話がしたいのではないけれど。