プログラミングにおける純粋関数とは、関数の出力が引数だけに依存し、副作用を持たない関数のことです。つまり、同じ入力に対して常に同じ結果を返し、外部の状態を書き換えたり、外部から読み取ったりしない関数を指します。
純粋関数の基本条件
純粋関数であるためには、以下の条件を満たす必要があります。
- 関数の戻り値は入力引数のみに依存する
- 関数内部でグローバル変数や外部データを変更しない
- 関数の実行によってプログラムの状態が変化しない(副作用なし)
プリプロセッサ定義と純粋性
C言語における #define MESSAGE "..." のようなプリプロセッサ定義は、コンパイル時に定数値として展開されます。これは関数が直接外部状態を参照しているわけではなく、コンパイル済みコード中に文字列リテラルとして埋め込まれるだけです。
そのため、プリプロセッサで定義された定数を読み取るだけであれば、関数の純粋性は原則として保たれます。外部からの可変データやグローバル変数を参照している場合とは異なります。
printfと副作用の関係
一方、 printf の呼び出しは標準出力にデータを書き込む副作用を伴います。このため、 printf を含む関数は純粋関数とはみなされません。純粋関数は入力に基づいて値を返すだけで、外部への書き込みや読み取りを行わない必要があります。
まとめ
整理すると、プリプロセッサで定義した定数を参照すること自体は純粋性を損なうものではありません。しかし、 printf のような外部への書き込みを行う場合、その関数は副作用を持つため純粋関数には該当しません。純粋関数の判断には、入力依存性と副作用の有無を基準に考えることが重要です。


コメント