マクロについては私も思うところがあります。 (そんなに構えないでください > 開発者さん)
プログラマの方が文法を考案される場合、マクロを導入されるならば、 まず引数について検討されるだろうと思いますので、恐らくその結果として Muse のマクロが引数を取らないということは、これには触れてはいけない のだろうな、という気がしつつ……
もし muse のマクロが引数を取れるようにするとしたら……というお題で、 開発者さんに倣って及ばずながら思索の散歩をしてみました(長いです)。
周知のように、muse のマクロは定義時にデフォルトで 1 度展開される という特徴があります。 この特徴を踏襲しようとすれば、himajin925 さんもお気付きのように、 定義時に仮引数のみならず実引数も与える必要があります。
さて、るうさんが挙げられた
> {$a{aaa} bbb}3 ${a} ccccc > 本質は1つのフレーズのループなので、無名マクロが使いたいなー、と。
は、マクロが引数を取れれば解決すると思います (もちろんるうさんは、引数がダメならせめて、という意図と思いますが)。
しかし、そうすると、定義時に実引数を与えるとすれば、
それはマクロ本体中に、展開される順序で書けた方が読みやすい。
ということに気が付きました。 つまり、
($x=bbb){aaa $x}3 {$ ccccc}
よりも、
($x){aaa $x=bbb}3 {$ ccccc}
の方が好ましいわけです(この例では互換性は無視しており、()も連符ではありません)
ここで私は、UNIX の正規表現を思い出しました。 早い話が、仮引数は用いず、参照は定義内での出現順序を示す数字で行うというものです。 例えば、上の例を、
{aaa {.bbb}}3 {.$ccccc}
のように書く文法を導入します。 つまり、$ の続かない {. から対応する } までをマクロ定義の引数、 {.$ から対応する } までを無名マクロの引数と解釈するのです。 直前に $ がない {. は現在の Muse では文法エラーになるはずです (個人的なことで恐縮ですが、今、HDD の重要なパーティションが飛んで、 Muse が動かせないので、違っていたらごめんなさい)。 要は、直前に $ がない { の直後で現在の文法では許されない文字で、 そこに名前が省略されていることを示すように見えるものなら互換性が保てると思います。
ちなみに、
> ただこれ、┌1.┐┌2.┐┌3.─みたいに増やす仕組みが難点。
は、
{aaa {.bbb}}3 {.$ccccc}2 {.$dddd} ……
のように書けます。
名前付マクロの場合は、
$a{aaa {.bbb}}3 ${a$ccccc}
のようにします。
引数を複数取る場合は、
{aaa1 {.bb1} aaa2 {.bb2}} {.$cccc1$cccc2} $a{aaa1 {.bb1} aaa2 {.bb2}} ${a$cccc1$cccc2}
で、展開の文法はるうさんのご提案と同じです。
この機能をフルに使った例は、例えば
{aaa {.bbb}2 ccc {.ddd} eee {1} fff {2}2} {.$ggg$hhh}
のようになり、これは
aaa bbb bbb ccc ddd eee bbb fff ddd ddd aaa ggg ggg ccc hhh eee ggg fff hhh hhh
のように展開されます。 ここで {1}、{2} は、それを含む最小の定義内でそれぞれ 1 番目、2 番目に 現れた引数に展開されるものです(これも現在は文法エラーのはず)。
{. …… } や { 数字 } が、マクロ定義の中でのみ許容されるというのは 望ましい制約と考えています。 というのは、上の例でるうさんが「無名マクロを使いたい」と仰った理由の一つに 名前付マクロの名前の有効範囲が大域的なことがあるように思われるからです。 有効範囲が大域的ですと、Muse ではマクロの再定義が許されていないので、 規模の大きいファイルでは、重複を避けるために名前を長くする必要が出てきます。
一方、出現順序による参照は、広い範囲で使うと出現箇所を数え切れなくなりますが、 狭い範囲で使う分には、名前を付けなくていいので、無名マクロと同程度に手軽に 使うことができると思います。 言い換えれば、{ 数字 } は、有効範囲の限定と引き換えに、直前より前の定義の 参照を可能にする無名マクロとして機能するのです。
この方法なら、展開部分にも現在のマクロ機構の処理が流用できて、
> でもこれ、C++が廃絶したくて仕方ないプリプロセッサマクロですから、 > 単純な置き換えにするのでは時代遅れ感が出てくる、というのが悩み所。
という懸念も回避できるのではないでしょうか。
|