Ik heb een probleem met het implementeren van toegang tot de standaard
fprintf functie in de library van een programmeertaal. De taal
compileert naar C en alle primitieven van de taal zijn geimplementeerd
door een conversie te doen naar de normale C functie aanroep. De
programmeertaal heeft een universeel data type: ATerm. Van een ATerm
kan je opvragen wat z'n echte type is, bijvoorbeeld Int, Real, Appl.
Nu wil ik dus fprintf toevoegen aan de library, maar ik wil hem niet
zelf implementeren. Ik wil dus gebruik maken van de standaard
fprintf. De conversie van het universele ATerm type naar de types
char*, int of double is hierbij een probleem. De argumenten na
"format" moeten namelijk geconverteerd worden voor de echte aanroep
naar fprintf. Helaas kan ik dit niet voor elkaar krijgen. Het probleem
lijkt hier te zijn dat je argumenten in een va_list niet kan bewerken
voordat je ze doorgeeft aan een andere functie.
Ik heb een paar vieze oplossingen bedacht, die echter allemaal niet
lukken:
Het probleem zou simpel op te lossen zijn als je zelf een va_list mag
opbouwen. Helaas kan dat niet, want er wordt gecontroleerd of de
functie waarin je va_start aanroept een variabel aantal argumenten
heeft, en of de opgegeven variabele het laatste argument met een naam
is. Deze optie valt dus af.
Ik heb ook nog zitten denken over een conversie functie die dan een
void* oplevert, maar dat schiet ook niet op, omdat er ook
geconverteerd moeten kunnen worden naar een int of double.
Ook zou je misschien nog kunnen denken aan conditionele expressies,
maar de 2e en 3e operand van die expressie moeten min of meer
vergelijkbare types hebben: je kan dus niet een char* of een int
opleveren.
Het gedoe met ATermen is misschien wat verwarrend, maar je zou als vergelijkbaar probleem kunnen denken aan het universele data type van strings, waarbij je voor de aanroep naar fprintf de strings wilt converteren naar een int of een double.
Wie heeft er een goed idee?
fprintf functie in de library van een programmeertaal. De taal
compileert naar C en alle primitieven van de taal zijn geimplementeerd
door een conversie te doen naar de normale C functie aanroep. De
programmeertaal heeft een universeel data type: ATerm. Van een ATerm
kan je opvragen wat z'n echte type is, bijvoorbeeld Int, Real, Appl.
Nu wil ik dus fprintf toevoegen aan de library, maar ik wil hem niet
zelf implementeren. Ik wil dus gebruik maken van de standaard
fprintf. De conversie van het universele ATerm type naar de types
char*, int of double is hierbij een probleem. De argumenten na
"format" moeten namelijk geconverteerd worden voor de echte aanroep
naar fprintf. Helaas kan ik dit niet voor elkaar krijgen. Het probleem
lijkt hier te zijn dat je argumenten in een va_list niet kan bewerken
voordat je ze doorgeeft aan een andere functie.
Ik heb een paar vieze oplossingen bedacht, die echter allemaal niet
lukken:
Het probleem zou simpel op te lossen zijn als je zelf een va_list mag
opbouwen. Helaas kan dat niet, want er wordt gecontroleerd of de
functie waarin je va_start aanroept een variabel aantal argumenten
heeft, en of de opgegeven variabele het laatste argument met een naam
is. Deze optie valt dus af.
Ik heb ook nog zitten denken over een conversie functie die dan een
void* oplevert, maar dat schiet ook niet op, omdat er ook
geconverteerd moeten kunnen worden naar een int of double.
Ook zou je misschien nog kunnen denken aan conditionele expressies,
maar de 2e en 3e operand van die expressie moeten min of meer
vergelijkbare types hebben: je kan dus niet een char* of een int
opleveren.
Het gedoe met ATermen is misschien wat verwarrend, maar je zou als vergelijkbaar probleem kunnen denken aan het universele data type van strings, waarbij je voor de aanroep naar fprintf de strings wilt converteren naar een int of een double.
Wie heeft er een goed idee?
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment