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