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