Recursion 如何在Haxe中编写相互递归函数

Recursion 如何在Haxe中编写相互递归函数,recursion,haxe,mutual-recursion,Recursion,Haxe,Mutual Recursion,我试图在haxe3中编写一个简单的相互递归函数,但无法编译代码,因为首先出现的任何一个相互函数都会报告组中的其他函数未定义。下面是一个最小的示例,其中使用相互定义的函数奇数和偶数来确定奇偶校验 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)

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

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++中一样,在
偶数
之前给出
奇数
的转发声明,但在haxe3中似乎是非法的。如何定义上述相互递归函数?有可能吗

注意:我希望将
奇数
偶数
都包装在全局可见函数
test
中作为本地函数


谢谢,

对于局部变量,您可以使用
myFn=function(){}
语法,而不是使用
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只需要知道
偶数
奇数
存在,并在使用它们之前设置为某个值(即使为null)。我们知道,在实际调用它们之前,我们会将它们都设置为可调用函数


请参见try haxe:

谢谢,杰森。这很接近。但我仍然收到一个错误,抱怨
odd
没有初始化
./test.hx:725:characters 19-22:未初始化的局部变量奇数
未捕获异常-load.c(181):未找到模块:main.n
抱歉,我应该测试该代码。这应该是
var偶数=null
var奇数=null
。哈克斯做得太彻底了,不利于自己。我将编辑我的答案。