a4_d0004: typedDef について
(1)
- プリプロセッサの普通の #define は、引数の型を見ないので、型に応じてdefineを使い分けることはできません。
- これは便利ではないなと思っていました。それで、defineマクロの引数にも型情報を持たせて、型も一致した場合のみに、そのマクロが適用されるような仕様を考えました。
- まず、プリプロセッサは基本的に型システムを持っていないため、簡易的な方法で型を表現しようと考えました。
- 私は、「マクロ引数の最初の数文字が型を表す」ということにしました。
#define i Int:R00
#define j Int:R01
#define d Double:F00
- こう書いた時、iは「Int:R00」という7文字のテキストでしかありませんが、Int型の「R00」に見立てるのです。
- 同様にdはDouble型の「F00」です。
(2)
#typedDef Let(Int:,r, CInt:,i) Lod_RI(r,i)
- これは第一引数rはInt型で、第二引数iはCInt型です(CIntはConstIntの略です)。
#typedDef Let(Int:,r, Int:,s) Lod_RR(r,s)
- この2つのマクロは引数の数が同じですが、型によって区別されて適切なほうが選ばれます。
(3)
- この #typedDef ですが、実は型という概念を正しく反映しているわけではなく、単に引数が「Int:」で始まっているかどうか、「CInt:」で始まっているかどうかを見ているだけです。
- ですから、その気になればいくらでも応用する余地があります。
(4)
- 基本的にマクロ引数の変数は型部分も含めてすべて引数として展開されます。したがって、
Let(i,j); → Lod_RR(Int:R00,Int:R01);
- になります。
- しかし場合によっては、この型情報がじゃまかもしれません。そういう時は defRight() を使います。 defRight() は defined() みたいな組み込みマクロ関数です。
#typedDef Let(Int:,r, Int:s) Lod_RR(defRight(r,:),defRight(s,:))
- このように書けば、それぞれ:の右側だけが抽出されて、
Let(i,j); → Lod_RR(R00,R01);
(5) (2026.04.26追記) typedDef 拡張案
- 型の一致を strncmp ではなく、 strstr でチェックするようにします。
- これは明らかに遅くなりますが(でもどのくらい遅くなるのかはわからない、体感差はないくらいかも)、代わりに先頭ではなく中に書いてある属性でもマッチ条件が作れます。
- 「::f1:Int::f2:stack::f3:32」みたいに型(f1)・アロケートタイプ(f2)・アロケート位置(f3)の3つの情報を持たせることができて、より複雑なマッチ条件が作れます。
- defLeft(defRight(x,::f2:),::)みたいにすれば狙ったフィールドだけ取り出すこともできます。
- このアルゴリズムのほうが応用範囲は広いと思うのですが、使いどころが分からなくて、まだ実装する気持ちにはなっていません。
こめんと欄