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
においても同じことが言えます)。