Programowanie D - miksy

Miksy to struktury, które umożliwiają mieszanie wygenerowanego kodu z kodem źródłowym. Mieszanki mogą być następujących typów -

  • Mixy strunowe
  • Mieszanki szablonów
  • Mieszane przestrzenie nazw

Mixy strunowe

D ma możliwość wstawiania kodu jako łańcucha, o ile ten ciąg jest znany w czasie kompilacji. Składnia kombinacji ciągów jest pokazana poniżej -

mixin (compile_time_generated_string)

Przykład

Poniżej przedstawiono prosty przykład miksów stringów.

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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Hello World!

Oto kolejny przykład, w którym możemy przekazać ciąg w czasie kompilacji, aby miksery mogły użyć funkcji do ponownego wykorzystania kodu. Jest to pokazane poniżej.

import std.stdio;

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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

str1
str2

Mieszanki szablonów

Szablony D definiują typowe wzorce kodu, aby kompilator generował rzeczywiste wystąpienia z tego wzorca. Szablony mogą generować funkcje, struktury, związki, klasy, interfejsy i każdy inny legalny kod D. Składnia kombinacji szablonów jest pokazana poniżej.

mixin a_template!(template_parameters)

Prosty przykład mieszania ciągów jest pokazany poniżej, gdzie tworzymy szablon z klasą Departament i mikserem tworzącym instancję szablonu, a tym samym udostępniając funkcje setName i printNames dla struktury college.

Przykład

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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

The names 
0 : name1 
1 : name2

Pomieszane przestrzenie nazw

Przestrzenie nazw w domenie są używane, aby uniknąć niejednoznaczności w szablonach. Na przykład mogą istnieć dwie zmienne, jedna zdefiniowana jawnie w main, a druga jest wmieszana. Gdy nazwa wmieszana jest taka sama jak nazwa w otaczającym zakresie, wówczas nazwa znajdująca się w otaczającym zakresie zostanie używany. Ten przykład jest pokazany poniżej.

Przykład

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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

name 1 
name 2