3

Haxe 3 で単純な相互再帰関数を書こうとしていますが、コードをコンパイルできませんでした。これは、最初に表示される相互関数のいずれかが、グループ内の他の関数が未定義であると報告するためです。相互に定義された関数oddevenを使用してパリティを決定する最小限の例を以下に示します。

static public function test(n:Int):Bool  {
    var a:Int;
    if (n >= 0) a = n; else a = -n;

    function even(x:Int):Bool {
        if (x == 0)
            return true;
        else
            return odd(x - 1);
    }
    function odd(x:Int):Bool {
        if (x == 0)
            return false;
        else
            return even(x - 1);
    }
    return even(a);
}

neko にコンパイルしようとすると、次のようになります。

../test.hx:715: characters 11-14 : Unknown identifier : odd
Uncaught exception - load.c(181) : Module not found : main.n

c/c++ で行うようにoddbeforeの前方宣言をしようとしましたが、haxe3 では違法のようです。even上記のような相互再帰関数をどのように定義できますか? それはまったく可能ですか?

注:グローバルに表示される function でラップされたローカル関数oddとの両方を持ちたいと思いました。eventest

ありがとう、

4

1 に答える 1

3

function myFn() {}ローカル変数の構文を使用する代わりに、構文を使用できmyFn = function() {}ます。次に、関数型シグネチャを使用する前に宣言することができます。

コードは次のようになります。

static public function test(n:Int):Bool  {
    var a:Int;
    if (n >= 0) a = n; else a = -n;

    var even:Int->Bool = null;
    var odd = null; // Leave out the type signiature, still works.
    even = function (x:Int):Bool {
        if (x == 0)
            return true;
        else
            return odd(x - 1);
    }
    odd = function (x:Int):Bool {
        if (x == 0)
            return false;
        else
            return even(x - 1);
    }
    return even(a);
}

evenこれが機能するのは、Haxe がそのことを認識して存在する必要がoddあり、使用前に何か (null であっても) に設定されているためです。実際に呼び出される前に、両方を呼び出し可能な関数に設定することがわかっています。

try haxe を参照してください: http://try.haxe.org/#E79D4

于 2014-06-22T00:16:11.883 に答える