Programación D - Mixins

Los mixins son estructuras que permiten mezclar el código generado con el código fuente. Los mixins pueden ser de los siguientes tipos:

  • Mixins de cuerdas
  • Mixins de plantilla
  • Mezclar espacios de nombres

Mixins de cuerdas

D tiene la capacidad de insertar código como cadena siempre que esa cadena se conozca en tiempo de compilación. La sintaxis de los mixins de cadenas se muestra a continuación:

mixin (compile_time_generated_string)

Ejemplo

A continuación se muestra un ejemplo sencillo de mixins de cuerdas.

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

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Hello World!

Aquí hay otro ejemplo en el que podemos pasar la cadena en tiempo de compilación para que los mixins puedan usar las funciones para reutilizar el código. Se muestra a continuación.

import std.stdio;

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

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

str1
str2

Mixins de plantilla

Las plantillas D definen patrones de código comunes, para que el compilador genere instancias reales a partir de ese patrón. Las plantillas pueden generar funciones, estructuras, uniones, clases, interfaces y cualquier otro código D legal. La sintaxis de los mixins de plantilla es la que se muestra a continuación.

mixin a_template!(template_parameters)

A continuación se muestra un ejemplo simple de mixins de cadenas, donde creamos una plantilla con la clase Department y un mixin instanciando una plantilla y, por lo tanto, haciendo que las funciones setName y printNames estén disponibles para la estructura de la universidad.

Ejemplo

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(); 
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

The names 
0 : name1 
1 : name2

Espacios de nombres Mixin

Los espacios de nombres de mixin se utilizan para evitar ambigüedades en los mixins de plantilla. Por ejemplo, puede haber dos variables, una definida explícitamente en main y la otra mezclada. Cuando un nombre mezclado es el mismo que un nombre que está en el alcance circundante, entonces el nombre que está en el alcance circundante obtiene usado. Este ejemplo se muestra a continuación.

Ejemplo

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(); 
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

name 1 
name 2