プログラミング言語で定義された動作としてスウィズリングをどのように記述しますか? (GLSL の行列やベクトルのようなスウィズリング メンバー) では、一部のメンバーでスウィズリングの定義を可能にするプログラミング言語を作成したい場合、どのようにすればよいでしょうか? たとえば、私はこれを行うことができます:
struct
{
swizzable
{
float x, float y, float z, float w
}
}
しかし、これには多くのものが欠けています。たとえば、要素を多かれ少なかれ入れ替えたり、サブセットに割り当てたり、要素を逆方向に割り当てたりすると、何を返すかを定義しません。GLSL のように、v.xyz を実行して、v という Vec4 から Vec3 を作成できます。または、メンバーのサブセットを割り当てることもできます: v.zyx = ... 任意の順序で。
したがって、この切り替え可能な部分構造は解決策ではありません (または、少なくとも制限が多すぎます)。もう 1 つの方法は、swizzled メンバーの配列を返すことであり、暗黙のキャスト (コンストラクターを使用) によって必要な要素が生成されます。
struct Vec2
{
swizzable { float x, float y }
Vec2(float[2] elements)
{ x = elements[0]; y = elements[1]; }
}
struct Vec3
{
swizzable { float x, float y, float z }
}
したがって、スウィズリングを介して Vec3 の x と y にアクセスすると、float[2] が得られ、Vec2 のコンストラクターがあるため、この配列をそれに割り当てることができます (暗黙的に vec2 をインスタンス化します)。
これはより良い解決策のように見えますが、それでも: どうすればもっとうまくやれるでしょうか?
編集:申し訳ありませんが、質問を指定しませんでした:この種のことをサポートするプログラミング言語を実装したいです。