String Metaprogramming

Clayton via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jul 18 09:18:29 PDT 2015


On Saturday, 18 July 2015 at 13:56:36 UTC, Adam D. Ruppe wrote:
> On Saturday, 18 July 2015 at 13:48:20 UTC, Clayton wrote:
>> There seems to be a lot of mutation happening here yet I have 
>> heard no mutation should take place in meta-programming as it 
>> subscribes to functional programming paradigm.
>
> That's not true in D, you can just write a regular function and 
> evaluate it in a compile time context, like initializing a 
> static variable.
>
> You usually don't need to write special code for compile time 
> stuff in D.


Thanks , you were right . It seems there are some key words 
though which one has to use so that the code gets executed on 
compile-time .For example I had to change the second forloop to a 
foreach loop, and then put and enum to ensure that 
TableFromCompiler gets evaluated at compiletime. Having written 
the code this way though gives rise to some other question, D 
supports 2 approches to compiletime metaprogramming i.e. CTFE and 
Templates, it seems am not very sure which paradigm my code falls 
in.


import std.stdio;
import std.string;
import std.conv;


I[C]  computeAtCompileTime(S ,C,I)( const S  pattern ){
   I[C] table1;

   const int size = to!int(pattern.length) ;//Length of the 
pattern to be matched

   foreach( c; ALPHABET){   //Initialise array
           table1[c] = size;
     }

   foreach(i; 0..size-1){
	     table1[pattern[i]] = size -i-1;
   }
   return table1;
}

void main(){

      enum TableFromCompiler  = computeAtCompileTime!(const string 
,char, int)(pattern);

      writeln(TableFromCompiler);
  }


More information about the Digitalmars-d-learn mailing list