ループの実装は、ソースレベルで展開するように修正することができた。これで ) や ( を使った相対音量指定がループ付きで簡単に展開出来る...と思ってMMLを書いてみて、問題にぶつかってしまった。( と ) は、計算の優先度を操作するために(要するに括弧付きの式)、既に使われてしまっていたのである。間が悪いことに、これらは名前としてはきちんと妥当するよう、パーサは実装されていたので、今の今まで忘れられていた。
どう解決すべきか悩む。とはいっても、parenthesized expressionとして使えなくするのが正しい解決策だろう。問題は、その穴埋めをどうするかだ。
- ( と ) のそれぞれを、__( と )__ とかに置き換える: 出来なくはないが、MMLが直感的でなくなるので望ましくない。
- { と } に置き換える: 多少MMLが直感的でなくなる程度なので悪くはないが、マクロ定義にも使用されているトークンなので、MML解析にちょっと工夫が必要になる
- 優先度指定式が不要になるように、演算式をLISPyに +(3,4) とか -(4,1) といった式にする。やはり直感的ではなくなる(LISPerにとっては直感的か)。
少し冷却期間をおいて考えることにしよう。
ふと、テキスト音楽サクラに ( と ) が命令として存在しないのを思い出した(サクラにはv+, v-という命令が存在する)。おそらく同じような罠にはまって、音量相対指定コマンド(というより有効なマクロ文字)としての ( ) を禁止したのだろうなと思う。難しい問題だ。
...とりあえず、一番実装に影響の少ない { } を使うかたちで文法を変更することにした。
Leave a comment