Example #1
0
/*
 +------------------------------------------------------------------
 | FUNCTION  : MakeMethod
 | INPUT     : const char * : naam van de methode (Dylan syntax)
 |             PRIM   : primitive (C naam)
 |             ...    : variabel aantal argumenten
 | OUTPUT    : -
 | RETURN    : -
 | DATE      :
 |
 | ABSTRACT  : Toevoegen van een primitive methode aan de 
 |             methode dictionnary.
 |
 | CHANGES   :
 +------------------------------------------------------------------
 */
void MakeMethod( const char *MethodName, PRIM g , DylanObject *obj, ...)  
{
   List<Parameter *> *ParList ;
   va_list            args ;
   DylanObject       *AnObject ;
   Method            *Primitive ;
   int                Counter = 0 ;

   ParList = new List<Parameter *> ;
   ParList->AppendItem( new Parameter( (parameter_types) obj->ReturnParaType(), "dummy", new ConstRef(obj), (char *) NULL )) ;

   va_start( args, obj ) ;
   AnObject = va_arg( args, DylanObject * ) ;
   while ( AnObject != NULL )
   {
      ParList->AppendItem( new Parameter( (parameter_types) AnObject->ReturnParaType(), "dummy", new ConstRef(AnObject), (char *) NULL )) ;
      AnObject = va_arg( args, DylanObject * ) ;
   }

   Primitive = new Method( MethodName, ParList, g ) ;
   MethodDict.InsertMethod( Primitive, 0 ) ;
}
Example #2
0
/*
 +------------------------------------------------------------------
 | FUNCTION  : local_apply
 | INPUT     : function : een methode
 |             list     : een lijst van argumenten
 | OUTPUT    : -
 | RETURN    : een object
 | DATE      :
 |
 | ABSTRACT  : Uitvoeren van de functie f over een lijst van
 |             argumenten
 |
 | CHANGES   :
 +------------------------------------------------------------------
 */
DylanObject *local_apply( function *f, list *lijst )
{
   DylanObject *Arg[255] ; // 255 argumenten lijkt mij een voldoende limitatie
   List<DylanObject *> *P ;

   int i ;
   P = new List<DylanObject *> ;

   for( i = 0; i < lijst->Size(); i++ )
   {
      Arg[i+1] = lijst->GetElement(i) ;
      P->AppendItem(lijst->GetElement(i) ) ;
   }
   return apply( f, f->GetEnv(),P,Arg,NULL ) ; 
}