プログラミングをやっていると、「関数に副作用がある」とか「副作用がない」あるいは「純粋である」という話をちょいちょい耳にする。そして、「外界の状態を読み取るけど変更はしない関数」、例えば function getTime() { return Date.now(); } のような関数に副作用があるか?みたいな議論が始まったりする。 くだらない議論だ。 何か概念を定義するときは、それが「役に立つ」場面を提示できる必要がある。「関数の副作用」を定義するときは、「関数の副作用」がわかったときに何をしたいのかをはっきりさせる必要がある。「関数のどういう側面に注目したいか」を決めずに「副作用の有無」を論じるのはナンセンスだ。 ここでは、言語処理系(コンパイラー)を実装する者の立場で、関数の副作用について論じてみたい。 一般に、「副作用がない」関数の呼び出しは、「副作用がある」関数の呼び出しに対するも