Links
UJML Language Reference
ユーザー定義関数

UJMLではユーザー定義関数を定義し、プログラム中で使用することが可能です。

UJMLではビルトイン関数に加え、ユーザー定義関数の宣言と呼び出しを行う方法を提供しています。 関連項目: スクリプティング関数の使用方法

ユーザー定義関数を使用すると、より優れた、簡潔なコードを記述することが可能になります。

ユーザー定義関数は頻繁に使用するコードを一纏めにし、UJMLスクリプトから呼ぶことを可能にします。 関数の作成には他の関数を使用し、高位関数が低位関数を、低位関数がより低位の関数を呼ぶ、といった使いかたができます。 関数を使用するとコードのメンテナンスが用意になり、コードサイズが縮小し、結果としてアプリケーションのダウンロード時間の縮小に繋がります。

関数の宣言

ユーザー定義関数を宣言するには1つまたは複数のfunction要素をfunctions要素に記述します。 関連項目: functionsfunctionfunction要素は属性として関数名、戻り値の型、 そしてアクセス修飾子と可視性の修飾子(オプション)を備えています。 関数名の属性には妥当なUJML識別子を用いる必用があります。 関連項目: 識別子。 関数の戻り値の型にはUJMLで提供されているデータ型の中から任意に指定することができます。 関連項目: データ型。 また戻り値を返却しない関数を宣言することも可能です。その場合、関数の型は'void'型になります。 例:'<function name="doSomething" type="void">'。 関数のアクセス修飾子と可視性の修飾子はスコープの法則に従い、必用としている関数の要素が変更される場合もあります。 関連項目: スコープ関数のスコープと共有。 

関数の宣言はアプリケーション、パーティションそしてステートマシンに記述します。 関連項目: アプリケーションファイルパーティションファイルステートマシン

関数の構成物

関数の宣言には引数、変数、スクリプト、そして戻り値の要素を記述することができます。 これらの任意の要素のうち、どれを使用するかはその関数の用途に依存します。 複雑な関数では変数とスクリプト要素が必要になることがあります。 その他の関数では、すべての計算を戻り地の要素で行うかもしれません。 関数には、戻り値を持つ関数と持たない関数があります。後者は'void'型の関数といい、 戻り値の要素の記述を省きます。 

関数の引数の要素は、その関数を使用するスクリプトがどのような値の引数を渡すべきかを定義しています。 関連項目: 引数 関数内の変数とスクリプト要素は、その他の場所に記述された場合と同様の動作をします。 関連項目: Variables, スクリプティング。 戻り値の要素は、関数が実行された結果としてどのような値が返却されるかを指定しています。 関連項目: 関数の処理結果の返却。 

関数の宣言には、引数の要素と戻り値の要素のみを記述することが多々あります。 次の例で宣言されている2つの関数は同等です:

<!-- Add two values in script -->
<function name="add1" type="int">
    <parameters>
        <var name="right" type="int"/>
        <var name="left" type="int"/>
    </parameters>
    <variables>
        <var name="result" type="int"/>
    </variables>
    <script>
        result = right + left;
    </script>
    <return><ref>result</ref></return>
</function>

<!-- Add two values in eval -->
<function name="add2" type="int">
    <parameters>
        <var name="right" type="int"/>
        <var name="left" type="int"/>
    </parameters>
    <return><eval>right + left</eval></return>
</function>
関数内の変数

関数内の変数のスコープは、その関数の中にとどまり、関数の外からアクセスすることはできません。 関数内の変数はアプリケーションが有効である限り存続し、リエントラントではありません。 これは、関数内の変数は関数が呼び出される度に値が消去されることを意味します。

関数と副作用

関数の中のスクリプティングコードは、自身が宣言されているモジュールスコープ中の変数やステート変数の値を変更することができます。 関連項目: データのスコープと共有。 これは、モジュールのステートが関数の呼び出し前と呼び出し後で異なるという、 副作用が発生する可能性があることを意味します。

関数と再起的呼び出し

リエントラントな関数とは、関数の処理が完了する前に再度呼び出し可能である関数を指します。 UJMLの関数は、その関数の生成と使用方法のため、リエントラントではありません。 そのため、UJML関数では再帰的呼び出しを行うことはできません。 

再帰的呼び出しは、関数が自分自身を呼び出すか、また、自分自身を呼ぶその他の関数を呼ぶことにより発生します。 UJMLでは関数の再帰的呼び出しはサポートしていません。再帰的呼び出しを行った場合の動作は未定義となっています。

項目 
説明 
関数の計算の結果は呼び出し元のコードに返却することが可能。 
関数はスコープ付きの識別子であり、共有することが可能。 

次の例では、ある値ともうひとつの値との比率を計算しています。 このサンプルコードはmath.ujml サンプルコードの一部です。

<function name="pct" type="int">
    <parameters>
        <var name="val" type="int"/>
        <var name="percentOf" type="int"/>
    </parameters>
    <return>
        <eval>
            ((val * 100) + (percentOf / 2)) / percentOf
        </eval>
    </return>
</function>

 

次の例では、モジュールレベルの変数とステート変数に値を設定しています。 このサンプルコードはevents.ujml サンプルコードの一部です。

<function name="flashButton" type="void">
    <parameters>
        <var name="button" type="int"/>
    </parameters>
    <script>
        // Set flash colors.
        mButtonBackColor = &_COLOR_YELLOW; ;
        mButtonForeColor = &_COLOR_BLUE; ;

        // Show button in flashing mode.
        _clear_state(sButton[button]);
        sButton[button] = true;

        // Restore colors.
        mButtonBackColor = &_COLOR_BLUE; ;
        mButtonForeColor = &_COLOR_YELLOW; ;

        // Start flash countdown.
        if (mSoundLoaded)
        {
            sButtonFlasher[button] = &FLASH_SOUND; ;
        }
        else
        {
            sButtonFlasher[button] = &FLASH_DELAY; ;
        }
    </script>
</function>

 

次の例は、引数の値に応じてフォントのstyleの値を作成する関数のサンプルコードです。 このサンプルコードはvenclude.ent サンプルコードの一部です。

<function name="makeFontStyle" type="int">
    <parameters>
        <var name="bold" type="boolean"/>
        <var name="italic" type="boolean"/>
        <var name="underlined" type="boolean"/>
        <var name="outlined" type="boolean"/>
    </parameters>
    <variables>
        <var name="style" type="int"/>
    </variables>
    <script>
        style = &_FONT_STYLE_PLAIN;;

        if (bold)
        {
            style = style + &_FONT_STYLE_BOLD;;
        }

        if (italic)
        {
            style = style + &_FONT_STYLE_ITALIC;;
        }

        if (underlined)
        {
            style = style + &_FONT_STYLE_UNDERLINED;;
        }

        if (outlined)
        {
            style = style + &_FONT_STYLE_OUTLINED;;
        }
    </script>
    <return>
        <eval>style</eval>
    </return>
</function>
Copyright (c) 2000-2005 by UIEvolution, Inc. All rights reserved.
この項目に関するフィードバックをお寄せください。 Send feedback!