読者です 読者をやめる 読者になる 読者になる

ふるつき

記事と内容がないです

なんでimport std.algorithmできちゃうの〜〜? package.d

D言語のstd.algorithmはよくつかいます。mapとかreduceとかがあるので。

import std.algorithm;

 普段は気にならないこれが、今回は気になりました。何故かと言うと……

github.com

 これ、D言語の標準ライブラリ、Phobosですが、よく見て下さい。stdはディレクトリで、algorithmもディレクトリです。  その一方で、stdioは見てわかるようにD言語ソースコードです。

 algorithmの中をのぞいてみると、comparison.dなどがありあます。これらはD言語ソースコードです。たとえばcomparison.dにはclampやcmpの定義が書いてあります。

(  clampというのは、「知らなくても書けるけど知っとくとこっち使えばよかったじゃん」ってなる関数の一つで、clamp(a, x, y)と渡すと、aをx <= a <= yの範囲に調整してくれます。実装するならmax(min(a, y), x)となるでしょうか。

 cmpは、二つのレンジを比較する関数です。Cのstrcmpみたいな感じです(実際には、Rangeならなんでも受け取りますが)。

 )

 え、じゃあディレクトリもimportできるってこと? import std;で標準ライブラリのインポート全部済むの? と思いましたがそうは行きませんでした。

 D言語のimportの対象となるのは、moduleだけです。

 ではなぜ、import std.algorithmのような書き方ができるか。

 その秘密は、package.dにありました。

 D言語ではディレクトリ構造がそのままパッケージになるのですが(例えば、mylib/myfunc.dをimportする時は、import mylib.myfunc)、パッケージをimport可能にする魔法のファイル、package.dを書くことで、モジュール名からimportできます。

 package.dというのは決め打ちの名前で、これをpackageの中に置いておくと、パッケージがimportの対象になったとき、このファイルがimportされます。

 この中で、public import(現在のモジュールを外からインポートした際に、このimportも見えるようになるようなimportです)しておけば、そのパッケージ内のモジュールを一度にimportできる、というわけです。

 因みに、package.dで関数を定義とかそういうことも普通にできます。ただのDのソースコードとして扱われます。

出典(というかほぼほぼ丸パクリ……)

qiita.com