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