関数型プログラミング

Dは関数型プログラミングに重点を置き、関数型スタイルでの開発の ファーストクラスのサポートを提供します。

Dで関数は同じ入力パラメータが与えられたなら、 常に同じ出力が生成されることを意味するpureとして宣言できます。 pureな関数は可変のグローバルな状態にアクセスまたは変更ができず、 従って他のpureな関数のみを呼ぶことが許可されます。

int add(int lhs, int rhs) pure {
    impureFunction(); // ERROR: unable to call impureFunction here
    return lhs + rhs;
}

このaddの変種はその入力パラメータのみに依存した結果を、 それらのパラメータを変更することなく返すため強い純粋関数と呼ばれます。 Dは変更可能なパラメータを持つことがある弱い純粋関数のパラメータ定義も可能です:

void add(ref int result, int lhs, int rhs) pure {
    result = lhs + rhs;
}

これらの関数は純粋で、変更可能なグローバルの状態にアクセス、変更しないと考えられます。 変更可能なパラメータは変更されるかもしれません。

pureによる制約により、純粋関数はマルチスレッディング環境において設計によって データ競合を防止するのに理想的です。加えて純粋関数は簡単にキャッシュが可能であり、 様々なコンパイラ最適化を可能にします。

属性pureはテンプレート化された関数やauto関数の適用可能なところで、 自動的にコンパイラによって推論されます (@safe@safe@nogcにおいても同じことが言えます)。

掘り下げる

rdmd playground.d