振り返ってみると、 関数プログラムの特徴は、プログラムの「関数」が数学の「関数」と近い意味をもっている とはじめにいいました。 つまり、引数のとる値が同じであれば、関数のとる値は同じであるわけです。
一方、状態を用いたプログラミングの例(Cをつかう)を見てみましょう。
int global_var = 3; int foo (int x) { global_var++; return (x + global_var); } void main () { const int a = 4; foo(3); /* will return value 7 */ foo(3); /* will return value 8 */ global_var = 0; foo(3); /* will return 4 */ }この場合、foo(3) の値は、実行される毎に変化していきます。 これは、global_var という変数が状態を持ち、foo が呼ばれる毎に異なった値を返すからです。 つまり、「関数の返り値」が「引数の値」にだけよるのではなく、「メモリの状態」に影響 されるからであり、数学の「関数」の持つ性質とは大きく異なります。
ということで、C 言語でかかれた普通のプログラムは関数プログラミングされていませんし、 よって、 C 言語も関数型言語とは呼ばれません。
とはいえ、C で関数型なプログラミングをしてもらっても構いません。 例えば、先程のプログラムの例なら
int mul (int x, int y) { return (x * y); } int main () { const int a = 4; return (mul(a, mul(2, a))); }などと書けば、関数プログラミングをしているといっても罰はあたらないでしょう。