Как можно записать swizzling как определенное поведение на языке программирования? (переключение членов, таких как матрицы и векторы в GLSL). Итак, если бы я хотел создать язык программирования, который позволял бы определять преобразование некоторых членов, как лучше всего это сделать? Так, например, я мог бы сделать это:
struct
{
swizzable
{
float x, float y, float z, float w
}
}
Но этого очень не хватает. Например, он не определяет, что он должен вернуть, когда я прокручиваю больше или меньше элементов или назначаю подмножество или просто элементы назад. Как и в GLSL, я могу использовать v.xyz для создания Vec3 из Vec4 с именем v. Или я могу назначить подмножество элементов: v.zyx = ... в любом порядке.
Таким образом, эта swizzable подструктура не является решением (или, по крайней мере, слишком ограниченным). Другим способом было бы вернуть массив измененных элементов, а неявное приведение (с конструктором) сгенерировало бы нужный элемент:
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 }
}
Поэтому, если бы я получил доступ к x и y Vec3 с помощью swizzling, я бы получил число с плавающей запятой [2], а поскольку у меня есть конструктор для Vec2, я могу присвоить ему этот массив (и неявно создать экземпляр vec2).
Это выглядит как лучшее решение, но все же: как можно было бы сделать лучше?
Редактировать: извините, я не уточнил вопрос: я хочу реализовать язык программирования, поддерживающий такие вещи.