プログラムの構造

複数のソースコードファイルを同じプロジェクトで扱う方法です。

ソースコードファイルの階層

ソースコードは下記の各階層から構成されています (同一順)。

ソースコードの階層

ファイルの読み込み

ステートメントとグローバル変数

関数

パッケージとクラス

アプリケーションは一本以上のファイルから構成されています。

複数のソースコードファイルを扱う方法

Load 命令はプロジェクトへ別のソースファイルをインクルードします。

文法:

Load  "filename.ring"

注釈

Load 命令は、コンパイラの構文解析処理の段階で実行します。

ちなみに

実行時までファイル名がわからない、または関数でファイルのパスを取得する必要がある場合は、 eval() を使用します。

用例:

# ファイル : Start.ring

Load "sub.ring"

sayhello("Mahmoud")
# ファイル : sub.ring

func sayhello cName
        see "Hello " + cName + nl

Load Package

'Load' 命令により、複数の Ring ソースファイルをプロジェクトで使えますが、

グローバルスコープを共有しているため、グローバル変数の名前衝突が起きることがあります。

この問題は "Load Package" 命令で解決します。

"Load Package" 命令で新規生成したグローバルスコープへライブラリ (*.ring ファイル) を読み込みます。

これにより既存のグローバル変数との名前衝突を回避できます。これはライブラリ開発でも非常に便利です。

用例:

ファイル: loadpackage.ring

x = 100
? "Hello, World!"
load package "testloadpackage.ring"

? x
test()

ファイル: testloadpackage.ring

? "Hello from testloadpackage.ring"

x = 1000

test()

func test
        ? x

実行結果:

Hello, World!
Hello from testloadpackage.ring
1000
100
1000

Load Again

Ring 1.12 から Load Again コマンドが使えるようになりました。

このコマンドを使うと Ring ソースファイルにある定数を何度でも読み込めます。

これはグローバル定数による翻訳用 Ring ソースファイルを使用するときに便利です。

用例:

下記はアラビア語と英語に対応するプロジェクトからの引用です。

english.ring と arabic.ring ファイルには翻訳で使う定数があります。

これらのファイルはプログラムの開始時に読み込まれます。

Load コマンドで同じファイルの再読み込みはできません。

Load コマンドは同じソースファイルを一度だけ読み込み、それ以降の読み込み指定は無視するからです。

しかし Load Again コマンドならできます。

よって、下記のコードを使うと実行中にファイルの再利用ができます。

func setLang nLanguage
        if C_ENV_DEFAULT_LANG = nLanguage
                return
        ok
        C_ENV_DEFAULT_LANG = nLanguage
        # 言語の変更
                switch nLanguage
                        on C_TRANSLATION_ENGLISH
                                load again "translation/english.ring"
                        on C_TRANSLATION_ARABIC
                                load again "translation/arabic.ring"
                off