tutorial:nim:modules
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
tutorial:nim:modules [2024/03/12 00:53] – [標準ライブラリ] 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> | ||
行 53: | 行 53: | ||
メッセージに含まれる//" | メッセージに含まれる//" | ||
- | ====== エクスポート | + | |
+ | ===== エクスポート ===== | ||
モジュール内で定義されたシンボル、つまり、変数やプロシージャはデフォルトではモジュール外からアクセスできません。アクセスできるようにするには、エクスポートすることを明示しなければなりません。エクスポートするには、名前に'' | モジュール内で定義されたシンボル、つまり、変数やプロシージャはデフォルトではモジュール外からアクセスできません。アクセスできるようにするには、エクスポートすることを明示しなければなりません。エクスポートするには、名前に'' | ||
- | <codeprism lang=nim> | + | <file nim> |
# moduleA.nim | # moduleA.nim | ||
let foo* = 100 | let foo* = 100 | ||
行 66: | 行 67: | ||
echo foo # OK => 100 | echo foo # OK => 100 | ||
echo bar # コンパイルエラー! | echo bar # コンパイルエラー! | ||
- | </codeprism> | + | </file> |
上の例では、'' | 上の例では、'' | ||
行 76: | 行 77: | ||
インポートされるシンボルは直接インポートするモジュール内でエクスポートされているものだけです。 | インポートされるシンボルは直接インポートするモジュール内でエクスポートされているものだけです。 | ||
- | <codeprism lang=nim> | + | <file nim> |
# other/ | # other/ | ||
let bar* = 200 | let bar* = 200 | ||
行 88: | 行 89: | ||
echo foo # OK => 100 | echo foo # OK => 100 | ||
echo bar # コンパイルエラー! | echo bar # コンパイルエラー! | ||
- | </codeprism> | + | </file> |
__main.nim__からはother/ | __main.nim__からはother/ | ||
- | <codeprism lang=nim> | + | <file nim> |
# other/ | # other/ | ||
let bar* = 200 | let bar* = 200 | ||
行 105: | 行 106: | ||
echo foo # OK => 100 | echo foo # OK => 100 | ||
echo bar # OK => 200 | echo bar # OK => 200 | ||
- | </codeprism> | + | </file> |
定数やプロシージャについても同じ規則に従います。 | 定数やプロシージャについても同じ規則に従います。 | ||
- | <codeprism lang=nim> | + | <file nim> |
# other/ | # other/ | ||
const BAZ* = 300 | const BAZ* = 300 | ||
行 129: | 行 130: | ||
# echo sub2(1, 2) # コンパイルエラー! | # echo sub2(1, 2) # コンパイルエラー! | ||
# echo add3(1, 2, 3) # コンパイルエラー! | # echo add3(1, 2, 3) # コンパイルエラー! | ||
- | </codeprism> | + | </file> |
まとめると次のとおりです。 | まとめると次のとおりです。 | ||
* エクスポートするシンボルには'' | * エクスポートするシンボルには'' | ||
- | * 最エクスポートされていないかぎり、直接インポートするモジュール内でエクスポートされたシンボルしか有効にならない。 | + | * 再エクスポートされていない限り、直接インポートするモジュール内でエクスポートされたシンボルしか有効にならない。 |
* インポートするモジュールのパスはディレクトリ構造が反映される。 | * インポートするモジュールのパスはディレクトリ構造が反映される。 | ||
このようにかなりシンプルな規則となっています。 | このようにかなりシンプルな規則となっています。 | ||
- | ====== 標準ライブラリ | + | ===== 標準ライブラリ ===== |
- | 標準ライブラリもモジュールの仕組みを使って提供されていますので、使用したいものがあればまずインポートする必要があります。ただし、[[https:// | + | 標準ライブラリもモジュールの仕組みを使って提供されていますので、使用したいものがあればまずインポートする必要があります。ただし、[[https:// |
他にどのようなモジュールが提供されているかは、[[https:// | 他にどのようなモジュールが提供されているかは、[[https:// |
tutorial/nim/modules.1710172391.txt.gz · 最終更新: 2024/03/12 00:53 by freemikan