====== Kontexte ======
Kontexte ändern die Erwartungen an den Quelltext, bzw. dessen Formulierung.
glBegin( QL_QUADS );
glVertex3d( ... );
glVertex3d( ... );
glVertex3d( ... );
glVertex3d( ... );
glEnd();
glBegin() sollte hier einen neuen Kontext öffnen können, in dem gewisse Funktionen gerufen werden können:
glBegin( QL_QUADS )
{
glVertex3d( ... );
glVertex3d( ... );
glVertex3d( ... );
glVertex3d( ... );
};
Dafür muss ein Context ein Stichwort haben, mit dem er beginnt (glBegin), er kann eine Argumentenliste haben und ein pre und post-body:
OpenGlLib is dynamic library( "opengl.dll" )
{
access innerOpenGlContext
{
}
glBegin is code( int );
glEnd is code;
innerOpenGLContext:
glVertex3f is code( float, float, float );
}
glBegin is context( Gltype type )
{
pre
{
OpenGlLib.glBegin( type );
};
post
{
OpenGlLib.glEnd();
};
glVertex3d is code( float x, float y, float z )
{
// Diese Funktion kann nur innerhalb des Contexts von glBegin gerufen werden
OpenGlLib.glVertex( x, y, z );
};
};
main is code
{
glBegin( QL_QUADS )
{
glVertex3f( ... );
}
}
Kontexte haben eigene Namensräume.
So kann glBegin entweder Code oder context oder Klasse sein, aber nicht mehreres Gleichzeitig.
Einer Klasse kann man mit die Access-Rights somit Methoden verpassen, die nur innerhalb eines Namensraums - zum Beispiel eines Kontextes rufbar sind.
class Renderer
{
access RenderPublic is private // von private abgeleitet
{
context(GlType) GlBegin( read, write, construct, destruct, new, delete );
// Der Kontext GlBegin darf jetzt mehr als der globale Context, bzw. andere Namensräume.
}
RenderPublic:
a is int;
};