HYPER MIKAN BOX
検索
最近の変更
メディアマネージャー
サイトマップ
文書の表示
以前のリビジョン
バックリンク
ログイン
トレース:
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
====== モジュール ====== このチュートリアルでは数行程度の僅かなコードのプログラムしか作ってきませんでした。現実的なプログラムではもっと多くのコードが必要になります。多くの場合は一つのファイルに全てのコードを詰め込むよりも、そのコードの特性によって複数のファイルに分割したほうが管理しやすくなります。それぞれのファイルは独立したコンパイル単位、つまり、別々にコンパイルされます。そして、通常は、一つのファイルが一つのモジュールになります。 ====== インポート ====== モジュールはインポートして使用します。 例えば、myAppというプログラムがあったとして、次のような構成になっていたとします。 myApp/ ├── main.nim ├── moduleA.nim ├── moduleB.nim └── other/ ├── moduleA.nim └── moduleB.nim そして、__main.nim__はmoduleAとmoduleBを使用し、moduleAはotherのmoduleAを、moduleBはotherのmoduleBを使用していたとします。このような依存関係があるとき、各ファイルでimport文を使用して、それぞれ必要とするモジュールをインポートします。 <codeprism lang=nim> # main.nim import moduleA import moduleB ... # moduleA.nim import other/moduleA ... # moduleB.nim import other/moduleA # other/moduleA.nim ... # other/moduleB.nim ... </codeprism> このプログラムをビルドするには、トップレベルのソースファイルである__main.nim__だけをコンパイルに渡します。依存するモジュールの解決とソースファイルのコンパイルは自動的に行われます。 <cli> $ cd /path/to/myApp $ nim compile --out:myApp main.nim Hint: used config file '/home/freemikan/.choosenim/toolchains/nim-2.0.2/config/nim.cfg' [Conf] Hint: used config file '/home/freemikan/.choosenim/toolchains/nim-2.0.2/config/config.nims' [Conf] ........................................................................ Hint: [Link] Hint: mm: orc; threads: on; opt: none (DEBUG BUILD, `-d:release` generates faster code) 27620 lines; 0.120s; 30.332MiB peakmem; proj: /home/freemikan/code/NimTutorial/myApp/main.nim; out: /home/freemikan/code/NimTutorial/myApp/myApp [SuccessX] </cli> メッセージに含まれる//"out: /home/freemikan/code/NimTutorial/myApp/myApp [SuccessX]"//の部分から、正常に__main.rs__がコンパイルされて、//myApp//が生成されたことが確認できます。((コンパイラは中身が空のモジュールに対して警告が出力しますが、今は重要ではありません。)) ====== エクスポート ====== モジュール内で定義されたシンボル、つまり、変数やプロシージャはデフォルトではモジュール外からアクセスできません。アクセスできるようにするには、エクスポートすることを明示しなければなりません。エクスポートするには、名前に''*''をつけます。 <codeprism lang=nim> # moduleA.nim let foo* = 100 let bar = 200 # main.nim import moduleA echo foo # OK => 100 echo bar # コンパイルエラー! </codeprism> 上の例では、''foo*''は''*''が付与さているのでエクスポートされます。''bar''はそうではないのでエクスポートされません。moduleAをインポートする__main.nim__では、''foo''にのみアクセス可能で、''bar''はアクセス不可です。__main.nim__をコンパイルするとエラーになります。 Error: undeclared identifier: 'bar' __main.nim__では''bar''が全く見えていないことが分かります。 インポートされるシンボルは直接インポートするモジュール内でエクスポートされているものだけです。 <codeprism lang=nim> # other/moduleA.nim let bar* = 200 # moduleA.nim import other/moduleA let foo* = 100 # main.nim import moduleA echo foo # OK => 100 echo bar # コンパイルエラー! </codeprism> 定数やプロシージャについても同じ規則に従います。 <codeprism lang=nim> # other/moduleA.nim const BAZ* = 300 proc add3*(a, b, c: int): int = a + b + c # moduleA.nim import other/moduleA 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) # コンパイルエラー! </codeprism>
文書の先頭へ