correct way to create boiler plate code

Kai Meyer kai at unixlords.com
Mon May 16 14:29:29 PDT 2011


On 05/16/2011 01:08 PM, dmerrio wrote:
> I am parsing some formulas from a spreadsheet file. To duplicate
> the behavior of the spreadsheet functions, I am having to create a
> lot of boiler plate code that maps from the spreadsheet functions
> to the built-in functions. Mixin would seem to allow me to
> automate the boiler-plate creation, but i am not utilizing it
> correctly. What is the correct to call Mixin in this situation, or
> is their a better way to create the boiler-plate code?
>
> For background, i am new to D. D is my second language with my
> primary experience being a script kiddie in Excel VBA, so take it
> slow, please.
>
>
>
> import main; //class definition of rng
> import std.math; //trig functions
> import std.conv; //to!double
> import std.string; //toupper
>
> double transFunc(alias transedentalFunc)(rng aRng){
> 	try{return(transedentalFunc(aRng.getCellValue().coerce!
> (double)));} //cellValue stored as a Variant
> 	catch{return(transedentalFunc(to!double(aRng.getCellValue
> ().coerce!(string))));} //replicate spreadsheet behavior and
> convert to a number
> }
>
> //Example 1 of boilerplate code
> double SIN(double aReal){return(sin(aReal));}
> double SIN(string aStr){return(sin(to!double(aStr)));}
> double SIN(rng aRng){return(transFunc!(sin)(aRng));}
>
> //Example 2 of boilerplate code
> double COS(double aReal){return(cos(aReal));}
> double COS(string aStr){return(cos(to!double(aStr)));}
> double COS(rng aRng){return(transFunc!(cos)(aRng));}
>
> string[] funcs = ["tan"];
> void createFuncs(){
> 	foreach(func; funcs){
> 		mixin("double " ~ toupper(func) ~ "(double aReal)
> {return(" ~ func ~ "(aReal));}");
> 	}
> }
>
> calling mixin a compile time has the following error...
>
> Error	1	Error: variable func cannot be read at compile time
> 	C:\D\SVNProjects\trunk\xcellD\xcell1\trig.d	22
>
>
> thanks for your help

This works:

//import main; //class definition of rng
import std.math; //trig functions
import std.conv; //to!double
import std.string; //toupper
import std.stdio;

void main()
{
     mixin(createFunc!("sin"));
     mixin(createFunc!("cos"));
     mixin(createFunc!("tan"));
     writeln(SIN(0)); // 0
     writeln(COS(0)); // 1
     writeln(TAN(0)); // 0
     return;
}
template createFunc(string func){
     const char[] createFunc = "double " ~ toupper(func) ~ "(double aReal)
         {return(" ~ func ~ "(aReal));}";
}

Stole it from http://www.digitalmars.com/d/2.0/mixin.html

I don't think there's a way to use an array of strings, since (as 
pointed out by others and your error message) that mixins are done 
compile-time and foreach are done (mostly) at run-time.


More information about the Digitalmars-d-learn mailing list