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