tutorial:nim:modules
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
tutorial:nim:modules [2024/03/11 23:06] – [インポート] freemikan | tutorial:nim:modules [2024/08/19 19:20] (現在) – freemikan | ||
---|---|---|---|
行 1: | 行 1: | ||
====== モジュール ====== | ====== モジュール ====== | ||
- | このチュートリアルでは数行程度の僅かなコードのプログラムしか作ってきませんでした。現実的なプログラムではもっと多くのコードが必要になります。多くの場合は一つのファイルに全てのコードを詰め込むよりも、そのコードの特性によって複数のファイルに分割したほうが管理しやすくなります。それぞれのファイルは独立したコンパイル単位、つまり、別々にコンパイルされます。そして、通常は、一つのファイルが一つのモジュールになります。 | + | このチュートリアルでは数行程度の僅かなコードのプログラムしか作ってきませんでした。現実的なプログラムではもっと多くのコードが必要になります。多くの場合は一つのファイルに全てのコードを詰め込むよりも、そのコードの特性によって複数のファイルに分割したほうが管理しやすくなります。それぞれのファイルは独立したコンパイル単位、つまり、別々にコンパイルされます。そして、通常は一つのファイルが一つのモジュールになります。 |
- | ====== インポート | + | ===== インポート ===== |
モジュールはインポートして使用します。 | モジュールはインポートして使用します。 | ||
行 19: | 行 19: | ||
そして、__main.nim__はmoduleAとmoduleBを使用し、moduleAはotherのmoduleAを、moduleBはotherのmoduleBを使用していたとします。このような依存関係があるとき、各ファイルでimport文を使用して、それぞれ必要とするモジュールをインポートします。 | そして、__main.nim__はmoduleAとmoduleBを使用し、moduleAはotherのmoduleAを、moduleBはotherのmoduleBを使用していたとします。このような依存関係があるとき、各ファイルでimport文を使用して、それぞれ必要とするモジュールをインポートします。 | ||
- | <codeprism lang=nim> | + | <file nim> |
# main.nim | # main.nim | ||
import moduleA | import moduleA | ||
行 37: | 行 37: | ||
# other/ | # other/ | ||
... | ... | ||
- | </codeprism> | + | </file> |
- | このプログラムをビルドするには、トップレベルのソースファイルである__main.nim__だけをコンパイルに渡します。依存するモジュールの解決とソースファイルのコンパイルは自動的に行われます。 | + | このプログラムをビルドするには、トップレベルのソースファイルである__main.nim__だけをコンパイラに渡します。依存するモジュールの解決とソースファイルのコンパイルは自動的に行われます。 |
<cli> | <cli> | ||
行 52: | 行 52: | ||
</ | </ | ||
- | メッセージに含まれる'' | + | メッセージに含まれる//"out: / |
- | ====== エクスポート ====== | + | |
+ | ===== エクスポート ===== | ||
+ | モジュール内で定義されたシンボル、つまり、変数やプロシージャはデフォルトではモジュール外からアクセスできません。アクセスできるようにするには、エクスポートすることを明示しなければなりません。エクスポートするには、名前に'' | ||
+ | <file nim> | ||
+ | # moduleA.nim | ||
+ | let foo* = 100 | ||
+ | let bar = 200 | ||
+ | |||
+ | # main.nim | ||
+ | import moduleA | ||
+ | echo foo # OK => 100 | ||
+ | echo bar # コンパイルエラー! | ||
+ | </ | ||
+ | |||
+ | 上の例では、'' | ||
+ | |||
+ | Error: undeclared identifier: ' | ||
+ | |||
+ | __main.nim__では'' | ||
+ | |||
+ | インポートされるシンボルは直接インポートするモジュール内でエクスポートされているものだけです。 | ||
+ | |||
+ | <file 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/ | ||
+ | |||
+ | <file nim> | ||
+ | # 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 | ||
+ | </ | ||
+ | |||
+ | 定数やプロシージャについても同じ規則に従います。 | ||
+ | |||
+ | <file nim> | ||
+ | # 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:// |
tutorial/nim/modules.1710166017.txt.gz · 最終更新: 2024/03/11 23:06 by freemikan