Programação D - Mixins

Mixins são estruturas que permitem a mistura do código gerado no código-fonte. Mixins podem ser dos seguintes tipos -

  • Mixins de corda
  • Mixins de modelo
  • Mixin de namespaces

Mixins de corda

D tem a capacidade de inserir código como string, desde que essa string seja conhecida no momento da compilação. A sintaxe dos mixins de string é mostrada abaixo -

mixin (compile_time_generated_string)

Exemplo

Um exemplo simples para mixins de cordas é mostrado abaixo.

import std.stdio; 
 
void main() { 
   mixin(`writeln("Hello World!");`); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Hello World!

Aqui está outro exemplo onde podemos passar a string em tempo de compilação para que os mixins possam usar as funções para reutilizar o código. É mostrado abaixo.

import std.stdio;

string print(string s) {
   return `writeln("` ~ s ~ `");`; 
}
  
void main() { 
   mixin (print("str1")); 
   mixin (print("str2")); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

str1
str2

Mixins de modelo

Os modelos de D definem padrões de código comuns, para o compilador gerar instâncias reais desse padrão. Os modelos podem gerar funções, estruturas, uniões, classes, interfaces e qualquer outro código D legal. A sintaxe dos mixins de template é mostrada abaixo.

mixin a_template!(template_parameters)

Um exemplo simples para mixins de string é mostrado abaixo, onde criamos um template com a classe Department e um mixin instanciando um template e, portanto, tornando as funções setName e printNames disponíveis para a estrutura college.

Exemplo

import std.stdio;

template Department(T, size_t count) { 
   T[count] names;  
   void setName(size_t index, T name) { 
      names[index] = name; 
   } 
   
   void printNames() { 
      writeln("The names");  
      
      foreach (i, name; names) { 
         writeln(i," : ", name); 
      }
   }
}
 
struct College { 
   mixin Department!(string, 2); 
}
  
void main() { 
   auto college = College();  
   college.setName(0, "name1"); 
   college.setName(1, "name2");  
   college.printNames(); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

The names 
0 : name1 
1 : name2

Mixin Name Spaces

Os namespaces do Mixin são usados ​​para evitar ambigüidades nos mixins de template. Por exemplo, pode haver duas variáveis, uma definida explicitamente em principal e a outra é misturada. Quando um nome misturado é o mesmo que um nome que está no escopo circundante, então o nome que está no escopo circundante obtém usava. Este exemplo é mostrado abaixo.

Exemplo

import std.stdio;

template Person() { 
   string name; 
   
   void print() { 
      writeln(name); 
   } 
}

void main() { 
   string name; 
   
   mixin Person a; 
   name = "name 1"; 
   writeln(name); 
   
   a.name = "name 2"; 
   print(); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

name 1 
name 2