制御構造を使って楽をしよう


制御構造とは、同じ部分を繰返し実行したり、条件によって処理の内容を変えたりする場合に使います。

これによって、コンパイルの度に違う演奏をさせたり、演算による演奏が可能になったり、実験的な試みが出来たりします。


  1. コメント
    // ... (行末の改行までコメント)
    /* ... */
    /*から*/まで、囲まれた領域をコメントにします。
    このコメントは、/* cdefg /* check nest */ */ のように、ネストにもできます。
    *コメントに指定された部分は、コンパイルの始めに、空白文字に置き換えられます。

  2. 制御
    [num : ]
    MMLでよく使う単純ループです。[ ... ]の間をnum回ループします。':'は、省略可能です。ループからの脱出を意味し、num回目にそのループから抜けます。
    [4 cdef ] // cdefの4回繰返し
    [2 cd [2 bb] ] // 展開→cd bbbb cd bbbb
    [2 [2c][2d] ] // 展開→ccdd ccdd
    [4 ccc : d ] e //展開→ ccc d ccc d ccc d ccc e
    [2 [2 ee:gg] aa]//展開→eeggeeaa eeggeeaa
    [2[2 c:d]:e]f//展開→cdce cdcf

    IF(条件){ true }ELSE{ false }
    ・条件分岐です。条件が正しければ{ true }を、正しくなければ、{ false }を実行します。
    ・条件には数値計算式が使えます。(今のところ文字列は条件になれません。)
    ・内部では、条件が0ならELSE{ false }部分を実行し、0以外なら{ true }部分を実行することになっています。以下、条件に有用な演算子と返却値です。
    a==b aとbが等しければ1を等しくないとき0を返す
    a!=0 aとbが等しく無い時1を、等しいとき0を返す
    a<b aがbより小さいとき1、それ以外0を返す
    a>b aがbより大きいとき1、それ以外0を返す
    a<=b aがb以下のとき1、それ以外0を返す
    a>=b aがb以上のとき1、それ以外0を返す
    ・ELSE{ false }は、省略することが出来ます。
    ・文字列の比較もできますが、#name 形式の文字列マクロを使って、比較せねばなりません。
    //変数と定数の比較
    Int AAA = 3;
    IF(AAA>0){ cccc }ELSE{ cgcg }
    IF(AAA<10){ cccc }ELSE{ cgcg }
    IF(AAA==3){ cccc }ELSE{ cgcg }

    //変数と変数の比較
    Int A = 100;
    Int B = 300;
    IF(A>=B){ cccc }ELSE{ g1 }
    IF(A!=B){ cccc }ELSE{ g1 }

    //直接数値を指定した場合
    IF(0){ Print({TRUE}) }ELSE{ Print({FALSE}) }
    IF(1){ Print({TRUE}) }ELSE{ Print({FALSE}) }
    IF(5){ Print({TRUE}) }ELSE{ Print({FALSE}) }

    WHILE(条件){ }
    ・条件が正しい間(1以上の時)、文を繰返します。(一応安全のため、同じ文を長時間繰返し続けるとエラー表示して止まります。)
    ・ループから強制的に脱出するには、EXITを使います。
    Int A=40;
    WHILE(A<127){
      A = A+Random(8);
      Print(A);
      IF(A==80){ EXIT; }//強制脱出
      l8n(A);
    }

    FOR(初期化;条件;増分){ }
    まず、変数を初期化し、条件が正しい(1以上)か判断します。もし、条件が正しければ、を実行し、その後、増分を実行します。それから、再び条件が正しいか判断し、正しければ、増分を実行します。これは、条件が正しい間繰返されます。
    FOR(Int A=1; A<=10; A=A+1){
      Print(A);
    }//1から10までを表示する

    FOR(Int B=0; B<16; B++){//B++はB=B+1と同義
      l16c
    }//{ l16c }を16回実行する

    FOR(Int C=0; C==0;){
      cdef
      C=Random(3);//Cに0〜2の乱数を代入する
    }//Cに0が代入されるまで繰返される

    FOR(Int I=0; I<32; I++){
      Int C = 40+Random(20)+I;
      l8n(C);//C番のノートナンバーを発音する
      Print(C);
    }//ランダムに32個のノートを発音する
    *追記:
    変数++で、変数の値を1増やします。
    変数--で、変数の値を1減らします。

    EXIT
    ループ内から強制的に脱出します。

戻る次へ