English

モジュールシステム

学習目標: Cm言語のモジュールシステムを使って、コードを整理し再利用する方法を学びます。
所要時間: 30分
難易度: 🟢 初級〜🟡 中級


概要

Cm言語は階層的なモジュールシステムを持ち、コードの整理と再利用を容易にします。


基本的なインポート

標準ライブラリのインポート

// std::io から println をインポート
import std::io::println;

int main() {
    println("Hello, World!");
    return 0;
}

複数の関数をインポート

// 複数のシンボルをインポート
import std::io::println;
import std::io::print;

int main() {
    print("Hello, ");
    println("World!");
    return 0;
}

ワイルドカードインポート

モジュール内のすべてをインポートできます:

// std::io のすべてをインポート
import std::io::*;

int main() {
    println("これで println が使えます");
    return 0;
}

相対パスのワイルドカード

// 同じディレクトリの utils モジュールをすべてインポート
import ./utils/*;

int main() {
    helper_function();  // utils 内の関数
    return 0;
}

エイリアスインポート

長いモジュール名に別名を付けられます:

// std::io を io という名前でインポート
import std::io as io;

int main() {
    io::println("エイリアス経由で呼び出し");
    return 0;
}

選択的インポート

特定のシンボルのみをインポート:

// println と print のみをインポート
import std::io::{println, print};

int main() {
    print("選択的");
    println("インポート");
    return 0;
}

エクスポート

他のモジュールから使えるようにするには export を使います:

関数のエクスポート

// utils.cm
export int add(int a, int b) {
    return a + b;
}

// プライベート関数(エクスポートなし)
int internal_helper() {
    return 42;
}

構造体のエクスポート

// models.cm
export struct Point {
    int x;
    int y;
}

export Point new_point(int x, int y) {
    return Point { x: x, y: y };
}

再エクスポート

インポートしたモジュールを再エクスポート:

// lib.cm
import ./utils;
import ./models;

// 再エクスポート
export { utils, models };

モジュール構造の例

my_project/
├── main.cm          # エントリーポイント
├── utils/
   ├── math.cm      # 数学関数
   └── strings.cm   # 文字列操作
└── models/
    └── user.cm      # User構造体
// main.cm
import ./utils/math::*;
import ./models/user::User;

int main() {
    int result = add(1, 2);
    User u = User { name: "Alice", age: 30 };
    return 0;
}

循環依存の回避

Cmコンパイラは循環依存を検出してエラーを報告します:

// ❌ エラー: a.cm と b.cm が互いにインポートし合う
// a.cm: import ./b;
// b.cm: import ./a;

解決策: 共通モジュールを作成して依存関係を整理します。


よくある間違い

1. パスの間違い

// ❌ 間違い: std/io ではなく std::io
import std/io::println;

// ✅ 正しい
import std::io::println;

2. 未エクスポートのシンボル

// ❌ エラー: internal_helper は export されていない
import ./utils::internal_helper;

// ✅ 正しい: export されたシンボルのみ使用可能
import ./utils::add;

まとめ

構文 用途
import mod::func; 単一シンボル
import mod::*; 全シンボル
import mod as alias; エイリアス
import mod::{a, b}; 選択的
export func() {} エクスポート
export { M }; 再エクスポート

次のステップ

最終更新: 2026-02-08