里々でループ処理

ループはプログラムの基本中の基本。
「全てのプログラムはループに通ず」
応用すればありとあらゆる作業を自動化できる魔法

単語内でのループ

  • 利点
    里々/整備班カスタムMc128-1あたりだと無限ループでも落ちません 完全なサブルーチンとして利用可能
  • 問題
    複雑で意味不明 ↓のサンプルではローカル変数の代用としてグローバル変数「変数」を使用しているので誤爆されるとバグる
  • しくみ
    >や$をifやsetに置き換えただけ

サンプル

  • (R*)や(FMO*name)などの規則のある値を取り込んで3バイト値区切りの簡易配列にして返す
    • ※バイト値3なのはReferenceに2バイト値まで含むものがあるため。
      • そのため、引数区切りは4バイト値になっている
(call,格納関数,前半文字列,変数の初期値,後半文字列,増加量,最大値)
  • 前半文字列にFMOを指定した時のみ自動で変数を半角数値に変える。それ以外は全角数値
  • 最大値はループ回数ではなく変数の上限値
  • 最大値0指定で取り込む値が無くなるまでループ
*installedghostname
$引数区切り追加【タブ】(sprintf,%c,4)
$仲間たち【タブ】(call,格納関数,R,0,,1,0)

*OnBoot
$起動中ゴーストリスト【タブ】(call,格納関数,FMO,0,name,1,(起動しているゴースト))

@格納関数
(set(sprintf,%c,4)変数(sprintf,%c,4)(if(sprintf,%c,4)(変数「変数」の存在)==1(sprintf,%c,4)(変数)(sprintf,%c,4)(A1)))((A0)((if(sprintf,%c,4)(compare(sprintf,%c,4)(A0)(sprintf,%c,4)FMO)==1(sprintf,%c,4)zen2han(sprintf,%c,4)han2zen)(sprintf,%c,4)(変数)(A2)))(sprintf(sprintf,%c,4)%c(sprintf,%c,4)3)(set(sprintf,%c,4)変数(sprintf,%c,4)(if(sprintf,%c,4)(is_empty(sprintf,%c,4)((A0)((if(sprintf,%c,4)(compare(sprintf,%c,4)(A0)(sprintf,%c,4)FMO)==1(sprintf,%c,4)zen2han(sprintf,%c,4)han2zen)(sprintf,%c,4)(calc(sprintf,%c,4)(変数)+(A3))(A2))))==(if(sprintf,%c,4)(if(sprintf,%c,4)(A4)==0(sprintf,%c,4)-1(sprintf,%c,4)(変数))>=(A4)(sprintf,%c,4)1(sprintf,%c,4)0)(sprintf,%c,4)(calc(sprintf,%c,4)(変数)+(A3))))(call(sprintf,%c,4)(if(sprintf,%c,4)(変数「変数」の存在)==1(sprintf,%c,4)格納関数(sprintf,%c,4)nop)(sprintf,%c,4)(A0)(sprintf,%c,4)(A1)(sprintf,%c,4)(A2)(sprintf,%c,4)(A3)(sprintf,%c,4)(A4))

 これで下のような配列で保存される

$仲間たち=さくら{3バイト値}Emily/Phase4{3バイト値}双葉{3バイト値}イクサイスゼロ{3バイト値}「自分の名前」{3バイト値}
$起動中ゴーストリスト=「自分の名前」{3バイト値}Emily/Phase4{3バイト値}

ふつうのループ

カウントダウンするループ処理で比較してみる
ループする方法は主に以下の3つ。

  • ジャンパを使う
    *
    $ループ回数【タブ】100
    >ループ処理
    
    *ループ処理
    >脱出【タブ】(ループ回数)==0
    :(ループ回数)
    $ループ回数【タブ】(calc,(ループ回数)-1)
    >ループ処理
    
    *脱出
    :終了ー
    • メリット
      ジャンプごとに条件をつけられる。
      処理が一度に行われる(\eが最後までつかない)為、バルーンには下のように列挙できる
      100
      99
      :
      2
      1
    • デメリット
      回数が限られる。
      あまりに多重ループをかけるとベースウェアごと落ちる。
      (れしばを見ているとすごいことになってる)
      PCにそれなりの負荷をかける
      ウチのPC環境では365回くらいが限界。

しかし、以下のようにジャンプする回数を減らすことで耐久性をアップできる
下の場合、5回分の処理を一つにまとめたので理論上365×5=1825回ループが可能(実際には1765回ぐらい

*
$ループ回数【タブ】100
>ループ処理

*ループ処理
>脱出【タブ】(ループ回数)==0
:(ループ回数)
$ループ回数【タブ】(calc,(ループ回数)-1)
>脱出【タブ】(ループ回数)==0
:(ループ回数)
$ループ回数【タブ】(calc,(ループ回数)-1)
>脱出【タブ】(ループ回数)==0
:(ループ回数)
$ループ回数【タブ】(calc,(ループ回数)-1)
>脱出【タブ】(ループ回数)==0
:(ループ回数)
$ループ回数【タブ】(calc,(ループ回数)-1)
>脱出【タブ】(ループ回数)==0
:(ループ回数)
$ループ回数【タブ】(calc,(ループ回数)-1)
>ループ処理

*脱出
:終了ー
  • ()を使う
    *
    $ループ回数【タブ】100
    >ループ処理
    
    *ループ処理
    >脱出【タブ】(ループ回数)==0
    :(ループ回数)
    $ループ回数【タブ】(calc,(ループ回数)-1)
    (ループ処理)
    
    *脱出
    :終了ー
    • メリット
      (call)を使えば引数をわたせる
      その場合、自作関数の呼び出しに使うのがいいかも
    • デメリット
      基本的にジャンパと何も変わらない為、多重ループすると落ちる
      その上、条件式を指定できない
      あえて違う点を上げるなら、れしばで>の表示がないから一行分節約できる
  • ![raise]を使う
    *
    $ループ回数【タブ】100
    >ループ処理
    
    *ループ処理
    >脱出【タブ】(ループ回数)==100
    :(ループ回数)
    $ループ回数【タブ】(calc,(ループ回数)-1)
    \![raise,ループ処理]
    
    *脱出
    :終了ー
    • メリット
      別イベントとして次々とイベントを起こしていくため、落ちない。
      完全な無限ループが可能(メリット?)
    • デメリット
      途中で他のイベントが割り込む可能性がある。
      イベントの最後に\eが付く為、下のように列挙できない。
100
99
98
:

尚、以下の様な方法で列挙も可能となる

*
$ループ回数【タブ】100
>ループ処理

*ループ処理
>脱出【タブ】(ループ回数)==100
$ループ回数【タブ】(calc,(ループ回数)-1)
$表示文字列【タブ】(if,(変数「表示文字列」の存在)==0,(ループ回数)\n,(表示文字列)(ループ回数)\n)
\![raise,ループ処理]

*脱出
:(表示文字列)
終了ー

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-12-09 (土) 22:52:45