事前実行スクリプト

昨日の件で調べた結果をまとめておきます。

  1. ニワン語には事前実行スクリプトがあり、その設定は途中で変更できない(ここまでwiki
  2. 事前実行スクリプトには、isWide, addPostRoute(), addButton()が該当する
  3. 事前実行スクリプトは記述された全スクリプトの中で最優先に実行される
  4. そのため、タイムラインの時間指定(0.00::/xxxxの0.00の部分)は無視される
  5. 3により、事前実行スクリプト内では変数及び関数は使用できない
  6. 逆に、関数の中で事前実行スクリプトを実行することもできない
  7. 事前実行スクリプトを代入文や制御構文と一緒に記述はできない

より詳しい補足

■3
事前実行スクリプトは同じ0.00::/xxxxの記述の中でも最優先に実行されます。
次のコードの実行順は3行目、1行目、2行目となります。

0.00::/a = 1
0.00::/b = 1
0.00::/addButton(xxxxxx)

さらによりマニアックに、次のコードの実行順は「addButton(xxxxxx)」→「a = 1」→「dt(a)」となります。

0.00::/a = 1; addButton(xxxxxx)
0.00::/dt(a)

■4
例え1.00::/isWide=trueと記述しても0秒目に処理されます。
同様の理由で、addButton()のボタン生成タイミングは引数内のvposの方のみに依存します。

■5
変数や関数の定義命令の前に実行されるため、それらが使えません。
次のコードはボタンの文字が「undefined」となってしまいます。

0.00::/mes = "ボタン"
0.00::/addButton(message:mes)

【注意】
式は使えます
次のコードはボタンの文字が「ボタン1」となります。

0.00::/addButton(message:"ボ" + "タ" + "ン" + 1)

ただし、1つだけ抜け道があって、addButton()の引数内で定義された変数のみは、その後有効になります。
次のコードは「ボタン」という文字のボタンが2つ作成されます。

0.00::/addButton(message:mes="ボタン")
0.00::/addButton(message:mes)

■6
事前実行スクリプトはおそらくコンパイル時に処理されていて、ニワン語は関数に関しては例えその関数を0.00に呼び出していても実行時評価のため、この仕様とバッティングします。(ここは推測)

■7
本来ニワン語の関数は例え値を返してもらう前提のものでなくとも代入文の右辺として書いても正しく動作しますが、事前実行スクリプトに関してはそれをつけてはいけません。
もしつけた場合、エラーとなってしまいその命令が処理されなくなります。
次のコードはボタン1は表示されますがボタン2は表示されません。

0.00::/addButton(message:"ボタン1")
0.00::/button2 = addButton(message:"ボタン2")

同様に制御構文内で事前実行スクリプトを記述しても処理されなくなります。
次のコードもボタンは表示されません

0.00::/if(1 == 1, then:addButton(xxxx))

条件分岐によりボタンを表示させたりさせなかったりができない、というのは結構痛手です・・・。