2011/01/14

こんな #define があったら面白いかも

 
#define を定義できる #define があったら面白そう。
 
 
何を言っているかわからないと思うので、例えばの話をしてみる。
 
拡張 #define として #define_var というキーワードがあるとする。これは、
特定のスコープの間だけ有効な #define を定義することができる。
 
例として、秀丸マクロを C言語風に使えたり出来る。
 

#define_var    string( a )    $$a
#define_var    int( a )    ##a
#define method( a )            call    a
#define method( a, b )        call    a, b
#define method( a, b, c )    call    a, b, c
#define main()
#define void
#define function( a )    a:

void    main(){
    int(a);           // 秀丸マクロの int 型を定義。以降 a へのアクセスは ##a に
    string(b);      // 秀丸マクロの string を定義。上記と同じ。

    a = 100;
    b = "ほげ";

    method( func );

} // 対応スコープを抜けることで int(a), string(b) の拡張定義は #undef される

void    function( func ){
    {

          int(a);      // 先ほど自動で #undef されたのでまた宣言できる
          string(b);

    } // #undef される

    int(a);      // 先ほど自動で #undef されたのでまた宣言できる
    string(b); 
    return;
}

 
 
けっこう、C言語っぽくないですか?
 
上記にプリプロセス通した後の、生の秀丸マクロソースは以下のようになります。
 

{
    ##a;
    $$b;

    ##a = 100;
    $$b = "ほげ";

    call func;

}

func:
{
    {

        ##a;
        $$b;

    }

    ##a;
    $$b;
    return;
}

 
アイデアとして面白かったら、自作のプリプロセッサに搭載してみよう。
 
バーチャルマシンや独自言語を実装する人向けに、C++ コンパイラ標準の
プリプロセッサを一部大きく上回る?仕様で作成しており、このようなキーワード
があれば、どんな言語でも移植性が非常に高まるのではないかと思ってます。
 
または以下のように、特定のキーワードが出た次の単語に対して自動で追加する
というのも面白いですね。
 
   #define_var_add   int  ##
   #define_var_add   string  $$
 
int a = 100; 
string b = "aa";
 
    ↓ プリプロセス後
 
##a = 100;
$$b  = "aa";
 
Doja/Star/MIDP/Android などで共通のラッパーを実装する上で、また機種依存を
対策する上でもプリプロセッサは絶対必要と考える自分は邪道だろうか。
 
Eclipse の良さは最近になってようやく納得してきたのですが、プリプロセッサを
必要とするレベルの開発ではキツイ。
 
数年前 Eclipse を使っていないというだけで、中途面接で非常に叩かれたことが
1回だけあったり。正確にはプリプロセッサではないけど enum{} 使えないのは
めんどくさくないんだろうか。

0 件のコメント:

コメントを投稿