parenthesized expressions

| No Comments | No TrackBacks

ループの実装は、ソースレベルで展開するように修正することができた。これで ) や ( を使った相対音量指定がループ付きで簡単に展開出来る...と思ってMMLを書いてみて、問題にぶつかってしまった。( と ) は、計算の優先度を操作するために(要するに括弧付きの式)、既に使われてしまっていたのである。間が悪いことに、これらは名前としてはきちんと妥当するよう、パーサは実装されていたので、今の今まで忘れられていた。

どう解決すべきか悩む。とはいっても、parenthesized expressionとして使えなくするのが正しい解決策だろう。問題は、その穴埋めをどうするかだ。

  • ( と ) のそれぞれを、__( と )__ とかに置き換える: 出来なくはないが、MMLが直感的でなくなるので望ましくない。
  • { と } に置き換える: 多少MMLが直感的でなくなる程度なので悪くはないが、マクロ定義にも使用されているトークンなので、MML解析にちょっと工夫が必要になる
  • 優先度指定式が不要になるように、演算式をLISPyに +(3,4) とか -(4,1) といった式にする。やはり直感的ではなくなる(LISPerにとっては直感的か)。

少し冷却期間をおいて考えることにしよう。

ふと、テキスト音楽サクラに ( と ) が命令として存在しないのを思い出した(サクラにはv+, v-という命令が存在する)。おそらく同じような罠にはまって、音量相対指定コマンド(というより有効なマクロ文字)としての ( ) を禁止したのだろうなと思う。難しい問題だ。

...とりあえず、一番実装に影響の少ない { } を使うかたちで文法を変更することにした。

No TrackBacks

TrackBack URL: http://veritas-vos-liberabit.com/noteon/mt-tb.cgi/44

Leave a comment

About this Entry

This page contains a single entry by note on published on July 14, 2009 2:37 AM.

ループの悪い実装と和音のやっつけ実装 was the previous entry in this blog.

疑似スペアナとパフォーマンス問題 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Categories

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 4.23-en