2016-07-21 3 views
0

Как написать swizzling как определенное поведение на языке программирования? (swizzling члены, такие как матрицы и векторы в GLSL). Так что, если бы я хотел создать язык программирования, который позволил бы определить swizzling для некоторых участников, что бы это было хорошего способа сделать это? Так, например, я мог бы это сделать:Определить swizzling программным способом (как в GLSL)

struct 
{ 
    swizzable 
    { 
     float x, float y, float z, float w 
    } 
} 

Но этого не хватает. Например, он не определяет, что он может вернуть, когда я swizzle более или менее элементов или назначить подмножество или просто элементы назад. Как и в GLSL, я могу сделать v.xyz для создания Vec3 из Vec4 с именем v. Или я мог бы назначить подмножество членов: v.zyx = ... в любом порядке.

Таким образом, этот swizzable substruct не является решением (или, по крайней мере, слишком ограниченным). Другим способом будет возвращать массив 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 с помощью swizzling, я хотел бы получить поплавок [2], и потому, что у меня есть конструктор для Vec2, я могу назначить ему этот массив (и неявно создать экземпляр vec2).

Это похоже на лучшее решение, но все же: как можно сделать лучше?

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

+0

Я не уверен, что вы просите здесь. Вы спрашиваете, как разработать язык программирования, который позволяет такие вещи? Или вы спрашиваете, как реализовать это поведение на определенном языке программирования? Или вы спрашиваете, как реализовать его на языке программирования, но у вас нет определенного языка программирования? –

+0

@TannerSwett первый. Извините, что я не указал этого. Я хочу создать язык программирования, который поддерживает это. –

+0

Ответ на этот вопрос сложный, так как способ реализации этой функции зависит от того, как вы реализуете все свои другие функции. –

ответ

0

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

Если я правильно понимаю, 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 }. Сам язык должен иметь возможность обрабатывать все детали того, как реализовать этот swizzling.

+0

Как бы язык знал, что swizzling результат от одной и той же структуры при разном количестве элементов? (вектор 2 -> vec2, 3-> vec3, matrix -> 4 mat2, 9-> mat3, ....) –

+0

Не могли бы вы сказать, что swizzling result всегда является вектором, где длина вектора равна равное количеству членов, которых вы swizzled? –

+0

Да, я думаю, я просто придерживаюсь этого. Не слишком гибкий. –

Смежные вопросы