3

我正在尝试在 Haxe 3 中编写一个简单的相互递归函数,但无法编译代码,因为首先出现的任何一个相互函数都会报告该组中的其他函数未定义。下面是一个最小示例,其中相互定义的函数odd用于even确定奇偶校验。

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++ 中那样给出odd之前的前向声明even,但它在 haxe3 中似乎是非法的。如何定义像上面这样的相互递归函数?有可能吗?

注意:我希望将两者都包含在全局可见函数中oddeven成为本地函数test

谢谢,

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);
}

这是可行的,因为 Haxe 只需要知道这一点evenodd存在,并在使用它们之前设置为某个值(即使它为空)。我们知道,在实际调用它们之前,我们会将它们都设置为可调用函数。

请参阅尝试 haxe:http ://try.haxe.org/#E79D4

于 2014-06-22T00:16:11.883 回答