2016-07-21 7 views
0

Wie würde man Swizzling als definiertes Verhalten in einer Programmiersprache schreiben? (swizzling members wie Matrizen und Vektoren in GLSL) Also, wenn ich eine Programmiersprache erstellen wollte, die die Definition von swizzling auf einigen Mitgliedern erlauben würde, was wäre ein guter Weg, es zu tun? Also zum Beispiel könnte ich das tun:Programmgesteuertes Swizzling definieren (wie in GLSL)

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

Aber das ist eine Menge fehlt. Zum Beispiel definiert es nicht, was es zurückgeben würde, wenn ich mehr oder weniger Elemente swizzle oder einer Untermenge oder nur den Elementen rückwärts zuteile. Wie in GLSL kann ich v.xyz verwenden, um einen Vec3 aus einem Vec4 namens v zu erstellen. Oder ich könnte eine Teilmenge von Mitgliedern zuweisen: v.zyx = ... in beliebiger Reihenfolge.

Also diese swizzable Substruktur ist keine Lösung (oder zumindest zu begrenzt). Eine andere Möglichkeit wäre eine Reihe von umgestellt Mitglieder und eine implizite Umwandlung zurückzukehren (mit einem Konstruktor) würde das gewünschte Element erzeugen:

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 } 
} 

Also, wenn ich ein vec3 der x und y über Swizzling zugegriffen wird, würde ich einen Schwimmer bekommen [2] und weil ich einen Konstruktor für Vec2 habe, kann ich ihm dieses Array zuweisen (und implizit ein vec2 instantiieren).

Dies sieht wie eine bessere Lösung aus, aber immer noch: Wie könnte man es besser machen?

Bearbeiten: Sorry, ich habe die Frage nicht angegeben: Ich möchte eine Programmiersprache implementieren, die diese Art von Sache unterstützt.

+0

Ich bin mir nicht sicher, was Sie hier fragen. Fragen Sie, wie man eine Programmiersprache entwickelt, die solche Dinge erlaubt? Oder fragen Sie sich, wie Sie dieses Verhalten in einer bestimmten Programmiersprache implementieren können? Oder fragen Sie, wie Sie es in einer Programmiersprache implementieren, aber Sie haben keine bestimmte Programmiersprache im Kopf? –

+0

@TannerSwett Der erste. Tut mir leid, dass ich das nicht angegeben habe. Ich möchte eine Programmiersprache erstellen, die dies unterstützt. –

+0

Das ist eine schwierige Frage, denn die Art und Weise, wie Sie diese Funktion implementieren, hängt davon ab, wie Sie alle anderen Funktionen implementieren. –

Antwort

0

Ich bin nicht sicher, wie man eine gute, detaillierte Antwort gibt, also hier ist nur eine Idee.

Wenn ich richtig verstehe, ist swizzling hauptsächlich eine syntaktische Bequemlichkeit. Die Seite https://www.opengl.org/wiki/GLSL_Optimizations gibt folgendes Beispiel von Swizzling:

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

Diese einfach syntaktischen Kurz wie etwas sein könnte:

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); 

Also, um herauszufinden, ein Schritt sein kann, wie die kürzere Syntax zu analysieren und interpretiere es als etwas, das der längeren Syntax ähnlich ist.

Ich sehe nicht, warum es notwendig wäre, die Struktur als etwas komplizierter als struct myStruct { float x, float y, float z, float w } zu deklarieren. Die Sprache selbst sollte in der Lage sein, alle Details zur Implementierung dieses Swizzlings zu handhaben.

+0

Wie würde die Sprache wissen, was das Swizzling-Ergebnis von der gleichen Struktur bei einer unterschiedlichen Anzahl von Elementen ist? (Vektor 2 -> vec2, 3-> vec3, Matrix -> 4 mat2, 9-> mat3, ....) –

+0

Könntest du nicht sagen, dass das Swizzling-Ergebnis immer ein Vektor ist, wo die Länge des Vektors ist gleich der Anzahl der Mitglieder, die Sie swizzled? –

+0

Ja, ich denke, ich bleibe dabei. Nicht zu flexibel tho. –