[D言語] (a, b) => b < aについて
Published on 2026-03-09Last Modified 2026-03-09
Table Of Contents
前提
API Documentationはversion 2.112.0を参照しています。 なお、私の手元環境はDebian GNU/Linux 12 (bookworm) 64bit + dmd v2.108.1です。
問題
std.algorithm.sorting.sortを利用するとき、例えば降順ソートだと
A.sort!((a, b) => b < a);
と書くことがあると思います。
ところで、(a, b) => b < aって一体何なのでしょうか?
正解
Expressions に答えが書いていました。
11.19.8.3 Function Literal Templatesによると、
A function literal will be a template when it has either:(関数リテラルは、いずれかの場合にテンプレートになります。)
- An unspecified parameter type and no context to infer it from.(指定されていないパラメータ型で、それを推測するためのコンテキストがありません。)
- An auto ref parameter.( 自動参照パラメータ。)
だそうです。
つまり、正解は「(a, b) => b < aは関数テンプレート」でした。
なので、脱糖すると
void main () {
int[] A = [3, 1, 4, 1, 5];
A.sort!(comp);
}
template comp (T) {
bool comp (T a, T b) {
return b < a;
}
}
に近いことが起こっているのだと推測できます。 なるほど〜
余談1
sortのシグネチャは
ドキュメント
によると
SortedRange!(Range,less) sort(alias less, SwapStrategy ss = SwapStrategy.unstable, Range)(
Range r
);
となっています。
今まで使ったことなかったのですが、SortedRange!(Range,less)がめちゃくちゃ便利かもしれないことに気が付きました。
細かい仕様は
ここ
に記載されていますが、競技プログラミング的には
containstrisect
が使えると嬉しい場面が多そうです。 ただ、indexを触りたいときにひと工夫必要そうなので肝心なときに役に立たない気もしています。
余談2
競技プログラミングでハードラックとダンスっちまったときにD言語のドキュメントに目を通していますが、基本的によ〜く読まないとよくわからない機能が多くて困っています。 他の言語に比べて、どこまでがライブラリ実装されていて、どこからランタイム機能になるのか難しい機能が多い印象です。
結局aliasがどこまでできて何ができないのかとかはよくわかっていません。
あとはメタプログラミングの文脈でのtuple(AliasSeq?)もよくわかりません。
とりあえずstd.typecons: Tupleとは全く異なるのはわかりますが、AliasSeqを用いたメタプログラミングは自力で組み立てられません。
(というのを書いているときにstd.typeconsのドキュメントを見に行ったのですが、そんなことできたんかい!みたいな機能が提供されていて、D言語練度の低さを思い知りました。)
なんというか、Dを使いこなすためにはプログラミングの作法や機能を知っていないといけないように感じて、 最初のプログラミング言語としては、PythonやJavaScriptの方が適している。 という記述はもっともだなと思いました。 (ただ、Pythonは型の意識が身につきにくいし、JavaScriptは至るところで非同期が絡んでくるから最初の言語として適しているか?とも思いますが…)

競技プログラミングばっかりやっていたら全然プログラミングうまくならないのでなんか別のことにも手を出したいですね。 技術書とかいうの読んでみたいです。