Как решить странную ошибку компилятора Haxe?

Я не думаю, что мой синтаксис здесь действительно плох. Или это? Это мой первый опыт в OpenFL.

Haxe не компилируется правильно? Я пропустил директиву компилятора? У меня действительно есть синтаксическая ошибка в этой функции? Проверка синтаксиса в Flashdevelop говорит «нет».

Вот команда:

Running process: C:\Program Files (x86)\FlashDevelop\Tools\fdbuild\fdbuild.exe "C:\dev\Haxe\TestOpenFL\OpenFLTest.hxproj" -ipc 2e4ace78-45b9-4868-a2dd-cf2c35265f44 -version "3.0.0" -compiler "C:\HaxeToolkit\haxe" -library "C:\Program Files (x86)\FlashDevelop\Library" -target "flash"

src/Main.hx:32: символы 16-17 : Неожиданно; Сборка остановлена ​​из-за ошибок (haxelib.exe).

function init() 
{
    if (inited) return;
    inited = true;

    //           \/ says this semicolon is unexpected. wtf 
    for (var i = 0; i < 200; i ++)
    {

        var bmd = new BitmapData( 100, 100, true, 0xff0000ff);
        var bmp = new Bitmap( bmd);

        addChild(bmp);

        bitmaps.push( bmp );            
    }

    addEventListener( Event.ENTER_FRAME, onEnterFrame );
}

Вот и весь сценарий. Я не могу на всю жизнь понять, почему это может привести к ошибке. Если я закомментирую только цикл, он отлично скомпилируется.

class Main extends Sprite 
{
var inited:Bool;    
var bitmaps:Array<Bitmap>;

/* ENTRY POINT */   
function resize(e) 
{
    if (!inited) init();
    // else (resize or orientation change)
}

function init() 
{

    bitmaps = new Array();

    if (inited) return;
    inited = true;

    for (var i = 0; i < 200 ; i ++)
    {
        // Assets:
        var bmd = new BitmapData( 100, 100, true, 0xff0000ff);
        var bmp = new Bitmap( bmd);

        addChild(bmp);

        bitmaps.push( bmp );            
    }

    addEventListener( Event.ENTER_FRAME, onEnterFrame );
}

private function onEnterFrame(e:Event):Void 
{
}




/* SETUP */

public function new() 
{
    super();
    addEventListener(Event.ADDED_TO_STAGE, added);
}

function added(e) 
{
    removeEventListener(Event.ADDED_TO_STAGE, added);
    stage.addEventListener(Event.RESIZE, resize);
    #if ios
    haxe.Timer.delay(init, 100); // iOS 6
    #else
    init();
    #end
}

public static function main() 
{
    // static entry point
    Lib.current.stage.align = flash.display.StageAlign.TOP_LEFT;
    Lib.current.stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;
    Lib.current.addChild(new Main());
}

}


person FlavorScape    schedule 26.09.2013    source источник
comment
Я не знаю Haxe конкретно, но вы должны попробовать объявить i вне цикла (чтобы в цикле не было var). Я знаю, что некоторые парсеры имеют проблемы с этим.   -  person Dave    schedule 27.09.2013
comment
Собственно, смотрите здесь: haxe.org/ref/syntax#for   -  person Dave    schedule 27.09.2013
comment
Хех, хорошо. Тогда мой синтаксис совершенно неверен для итератора. P.S. Я попытался объявить i вне цикла, что привело к другим ошибкам.   -  person FlavorScape    schedule 27.09.2013


Ответы (2)


Прежде всего: взгляните на страницу синтаксиса Haxe, она поможет вам решить многие ваши будущие проблемы.

Далее, for в Haxe немного сложнее, это своего рода foreach, поэтому вы используете его следующим образом:

for(myElem in elements){
    // loop here
}

Где элементы реализуют Itarable (например, массив, универсальный стек или карта). Но если вы хотите увеличить переменную, вы можете создать объект Iterable с помощью оператора .... Итак, чтобы взять ваш код в качестве примера:

for(i in 0...200){
    // loop here
}

Здесь i будет принимать в качестве значения все int от 0 до 200 (исключая).

person NorTicUs    schedule 27.09.2013
comment
С другой стороны, я думаю, поскольку и ..., и старомодный синтаксис цикла в порядке с проверкой синтаксиса Flashdevelop, мне интересно, может ли этот параметр измениться в FD. Угадайте, это совсем другой вопрос. - person FlavorScape; 27.09.2013

Полная нубская проблема. Погружайтесь прямо вместо того, чтобы читать документ (это лучший способ учиться, ИМХО).

Вы не можете использовать циклы в Haxe. Вы должны использовать итераторы.

for (i in 0...200)
{
         //do stuff
}
person FlavorScape    schedule 26.09.2013
comment
Это все еще цикл for, но не в стиле старого доброго c. - person Andy Li; 27.09.2013
comment
Но разве итератор не полагается на тип для определения оператора next()? while(setIterator.hasNext()){..} по сравнению с циклом, который будет выполнять итерацию независимо от списка? - person FlavorScape; 27.09.2013
comment
Хм, не уверен, что происходит под капотом, но, возможно, оператор ... говорит, не используйте итератор, тогда как синтаксис e4x для (x в y) использует итератор. - person FlavorScape; 27.09.2013
comment
Я имею в виду, что мы обычно думаем о цикле как о своего рода повторении. Существует несколько типов циклов, и использование итератора — один из них. Старый добрый c-стиль for — это еще один тип цикла. С точки зрения реализации, a...b в Haxe имеет тип IntIterator, но цикл будет компилироваться в простой цикл while. Но в любом случае это конечно петля. - person Andy Li; 29.09.2013