Определить swizzling программно (как в GLSL)

Как можно записать 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).

Это выглядит как лучшее решение, но все же: как можно было бы сделать лучше?

Редактировать: извините, я не уточнил вопрос: я хочу реализовать язык программирования, поддерживающий такие вещи.


person Peter Lenkefi    schedule 21.07.2016    source источник
comment
Я не уверен, что вы спрашиваете здесь. Вы спрашиваете, как разработать язык программирования, который позволяет такие вещи? Или вы спрашиваете, как реализовать такое поведение на каком-то конкретном языке программирования? Или вы спрашиваете, как это реализовать на языке программирования, но не имеете в виду конкретный язык программирования?   -  person Tanner Swett    schedule 21.07.2016
comment
@TannerSwett Первый. Извините, что не указал это. Я хочу создать язык программирования, поддерживающий это.   -  person Peter Lenkefi    schedule 21.07.2016
comment
На этот вопрос сложно ответить, потому что то, как вы реализуете эту функцию, зависит от того, как вы реализуете все остальные функции.   -  person Tanner Swett    schedule 21.07.2016


Ответы (1)


Я не уверен, как дать хороший, подробный ответ, так что вот только одна идея.

Если я правильно понимаю, swizzling - это в основном синтаксическое удобство. На странице https://www.opengl.org/wiki/GLSL_Optimizations приведен следующий пример swizzling :

gl_FragColor = mycolor.xyzw * constantList.xxxy + constantList.yyyx;

Это может быть просто синтаксическое сокращение для чего-то вроде:

gl_FragColor = Vector(mycolor.x, mycolor.y, mycolor.z, mycolor.w)
    * Vector(constantList.x, constantList.x, constantList.x, constantList.y)
    + Vector(constantList.y, constantList.y, constantList.y, constantList.x);

Таким образом, одним из шагов может быть выяснение того, как анализировать более короткий синтаксис и интерпретировать его как нечто похожее на более длинный синтаксис.

Я не понимаю, почему было бы необходимо объявлять структуру как нечто более сложное, чем struct myStruct { float x, float y, float z, float w }. Сам язык должен быть в состоянии обрабатывать все детали того, как реализовать это прокручивание.

person Tanner Swett    schedule 21.07.2016
comment
Как язык узнает, каков результат swizzling для одной и той же структуры с разным количеством элементов? (вектор 2 -> вектор2, 3-> вектор3, матрица -> 4мат2, 9->мат3, ....) - person Peter Lenkefi; 21.07.2016
comment
Не могли бы вы сказать, что результат swizzling всегда является вектором, где длина вектора равна количеству элементов, которые вы swizzling? - person Tanner Swett; 22.07.2016
comment
Да, я думаю, я просто буду придерживаться этого. Не слишком гибкий. - person Peter Lenkefi; 23.07.2016
comment
Я не знаю, что вы подразумеваете под не слишком гибким. Что ты хочешь сделать, чего не смог бы сделать с моей идеей? - person Tanner Swett; 25.07.2016