とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

動かないプログラム (2)

他言語を調べるとおもしろい。私がすでにある程度知っている旧世代の言語の問題点の解決策について考えたことが,それらの言語を参考にしているといわれる近代的な言語で実装されてる。かっこいい名前が付いて。
さてさて,そんなことはどうでもいいのだが,飯喰いながら考えていたら「動かないプログラム」をなぜ動いていないように感じたのか,分かっちゃった。たぶん。

やっぱり,副作用と関係があったんだ。副作用があるって事は時間の概念が生じる。

たとえば,変数への代入。

int n = 0;
n = 123;
n++;

n の値は刻々と変化する。このは 0。このは123。このは124。
だから Scheme で set! って叫ぶと,止まっていたプログラムが驚き動き出す。叫ばなければ動かない。

たとえば,IO

display はディスプレイを変化させる。
あるは Hello, 。あるは world! 。あるは n = 123 ってね。その時々で違うものが表示されるのだから,動いているのは当たり前。
また,displayを呼び出す順序で表示される内容は変わってくる。たとえ同じ呼出し方だとしても。次の (display "World!") に注目して欲しい。

; (1)
(begin
  (display "Hello, ")
  (display "World!"))
; (2)
(begin
  (display "World!"))

(1) で (display "World!") した後のディスプレイと,(2) で (display "World!") した後のディスプレイの状態は同じだろうか?違う。…何?当たり前?いや,その違いこそが副作用であって,時間の概念であって,手続き処理になれた人間にとって動いた感覚なんだ。
同じ関数を同じ引数で呼んだとき,いつも*1同じ結果が返るのが関数型。その返ってきた値が変更されないのが関数型。あってる?

*1:つまり時に左右されない