差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| tutorial:nim:modules [2024/03/12 01:41] – [モジュール] freemikan | tutorial:nim:modules [2025/05/20 11:20] (現在) – 削除 freemikan | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== モジュール ====== | ||
| - | このチュートリアルでは数行程度の僅かなコードのプログラムしか作ってきませんでした。現実的なプログラムではもっと多くのコードが必要になります。多くの場合は一つのファイルに全てのコードを詰め込むよりも、そのコードの特性によって複数のファイルに分割したほうが管理しやすくなります。それぞれのファイルは独立したコンパイル単位、つまり、別々にコンパイルされます。そして、通常は一つのファイルが一つのモジュールになります。 | ||
| - | |||
| - | ====== インポート ====== | ||
| - | |||
| - | モジュールはインポートして使用します。 | ||
| - | |||
| - | 例えば、myAppというプログラムがあったとして、次のような構成になっていたとします。 | ||
| - | |||
| - | myApp/ | ||
| - | ├── main.nim | ||
| - | ├── moduleA.nim | ||
| - | ├── moduleB.nim | ||
| - | └── other/ | ||
| - | ├── moduleA.nim | ||
| - | └── moduleB.nim | ||
| - | |||
| - | そして、__main.nim__はmoduleAとmoduleBを使用し、moduleAはotherのmoduleAを、moduleBはotherのmoduleBを使用していたとします。このような依存関係があるとき、各ファイルでimport文を使用して、それぞれ必要とするモジュールをインポートします。 | ||
| - | |||
| - | < | ||
| - | # main.nim | ||
| - | import moduleA | ||
| - | import moduleB | ||
| - | ... | ||
| - | |||
| - | # moduleA.nim | ||
| - | import other/ | ||
| - | ... | ||
| - | |||
| - | # moduleB.nim | ||
| - | import other/ | ||
| - | |||
| - | # other/ | ||
| - | ... | ||
| - | |||
| - | # other/ | ||
| - | ... | ||
| - | </ | ||
| - | |||
| - | このプログラムをビルドするには、トップレベルのソースファイルである__main.nim__だけをコンパイルに渡します。依存するモジュールの解決とソースファイルのコンパイルは自動的に行われます。 | ||
| - | |||
| - | <cli> | ||
| - | $ cd / | ||
| - | $ nim compile --out:myApp main.nim | ||
| - | Hint: used config file '/ | ||
| - | Hint: used config file '/ | ||
| - | ........................................................................ | ||
| - | Hint: [Link] | ||
| - | Hint: mm: orc; threads: on; opt: none (DEBUG BUILD, `-d: | ||
| - | 27620 lines; 0.120s; 30.332MiB peakmem; proj: / | ||
| - | </ | ||
| - | |||
| - | メッセージに含まれる//" | ||
| - | ====== エクスポート ====== | ||
| - | |||
| - | モジュール内で定義されたシンボル、つまり、変数やプロシージャはデフォルトではモジュール外からアクセスできません。アクセスできるようにするには、エクスポートすることを明示しなければなりません。エクスポートするには、名前に'' | ||
| - | |||
| - | < | ||
| - | # moduleA.nim | ||
| - | let foo* = 100 | ||
| - | let bar = 200 | ||
| - | |||
| - | # main.nim | ||
| - | import moduleA | ||
| - | echo foo # OK => 100 | ||
| - | echo bar # コンパイルエラー! | ||
| - | </ | ||
| - | |||
| - | 上の例では、'' | ||
| - | |||
| - | Error: undeclared identifier: ' | ||
| - | |||
| - | __main.nim__では'' | ||
| - | |||
| - | インポートされるシンボルは直接インポートするモジュール内でエクスポートされているものだけです。 | ||
| - | |||
| - | < | ||
| - | # other/ | ||
| - | let bar* = 200 | ||
| - | |||
| - | # moduleA.nim | ||
| - | import other/ | ||
| - | let foo* = 100 | ||
| - | |||
| - | # main.nim | ||
| - | import moduleA | ||
| - | echo foo # OK => 100 | ||
| - | echo bar # コンパイルエラー! | ||
| - | </ | ||
| - | |||
| - | __main.nim__からはother/ | ||
| - | |||
| - | < | ||
| - | # other/ | ||
| - | let bar* = 200 | ||
| - | |||
| - | # moduleA.nim | ||
| - | import other/ | ||
| - | export moduleA | ||
| - | let foo* = 100 | ||
| - | |||
| - | # main.nim | ||
| - | import moduleA | ||
| - | echo foo # OK => 100 | ||
| - | echo bar # OK => 200 | ||
| - | </ | ||
| - | |||
| - | 定数やプロシージャについても同じ規則に従います。 | ||
| - | |||
| - | < | ||
| - | # other/ | ||
| - | const BAZ* = 300 | ||
| - | proc add3*(a, b, c: int): int = a + b + c | ||
| - | |||
| - | # moduleA.nim | ||
| - | import other/ | ||
| - | const FOO* = 100 | ||
| - | const BAR = 200 | ||
| - | proc add2*(a, b: int): int = a + b | ||
| - | proc sub2(a, b: int): int = a - b | ||
| - | |||
| - | # main.nim | ||
| - | import moduleA | ||
| - | echo FOO # OK => 100 | ||
| - | # echo BAR # コンパイルエラー! | ||
| - | # echo BAZ # コンパイルエラー! | ||
| - | echo add2(1, 2) # OK => 3 | ||
| - | # echo sub2(1, 2) # コンパイルエラー! | ||
| - | # echo add3(1, 2, 3) # コンパイルエラー! | ||
| - | </ | ||
| - | |||
| - | まとめると次のとおりです。 | ||
| - | |||
| - | * エクスポートするシンボルには'' | ||
| - | * 再エクスポートされていない限り、直接インポートするモジュール内でエクスポートされたシンボルしか有効にならない。 | ||
| - | * インポートするモジュールのパスはディレクトリ構造が反映される。 | ||
| - | |||
| - | このようにかなりシンプルな規則となっています。 | ||
| - | |||
| - | ====== 標準ライブラリ ====== | ||
| - | |||
| - | 標準ライブラリもモジュールの仕組みを使って提供されていますので、使用したいものがあればまずインポートする必要があります。ただし、[[https:// | ||
| - | |||
| - | 他にどのようなモジュールが提供されているかは、[[https:// | ||
