Dizgi Katmaları [mixin]
Şablon katmalarına hem isim olarak hem de işlev olarak benziyor olsalar da, dizgi katmaları farklı olanaklardır.
Dizgi katmaları, derleme zamanı dizgilerinin D kodu olarak derlenmelerini ve programa dahil edilmelerini sağlayan olanaktır. D'de dizgi işlemlerine derleme zamanında da izin verildiği için, bu iki olanak birleştirilince özel bir alana yönelik [domain-specific] diller oluşturulabilmektedir.
Örneğin belirtilen isim ve üyelerle yapı oluşturan bir şablon şöyle tanımlanabilir:
template YapıOluştur(char[] Yapı, char[] Üyeler) { const char[] YapıOluştur = "struct " ~ Yapı ~ "{ int " ~ Üyeler ~ "; }"; } mixin(YapıOluştur!("Koordinat", "x, y"));
Bu mixin
'in ürettiği kod şöyledir:
struct Koordinat { int x, y; }
ve programda sıradan bir D kodu gibi kullanılabilir:
void main() { Koordinat k; k.x = 42; k.y = 7; writefln("%d,%d", k.x, k.y); }
Yaptığı iş metin dönüştürmek ve o metni kod olarak derletmek olduğu için dizgi katmaları C önişlemcisi olanaklarına benzerler. Ama aralarında önemli farklar vardır:
- C önişlemcisi sözcük çözümleme [lexical analysis] aşamasından önce çalışır. O yüzden C'nin sözcüklenmesi [lexing] ve ayrıştırılması [parsing] ancak bütün başlıkların eklenmesinden sonra olabilir; bütün klasörlerin içerikleri ve derleyici ayarları bilinmelidir. Katmalar ise anlamsal çözümleme [semantic analysis] aşamasında oluşurlar ve sözcükleme ve ayrıştırma aşamalarını etkilemezler. Sözcükleme ve ayrıştırma, çözümleme olmadan da yapılabilir.
- C önişlemcisi farklı gibi görünen söz dizimleri oluşturabilir:
#define BEGIN { #define END } BEGIN int x = 3; foo(x); END
Böyle bir şey katmalarda mümkün değildir. Katılan kodun yasal bildirimlerden, deyimlerden, ve ifadelerden oluşması gerekir.
- C makroları tanımlandıkları noktadan başlayarak kendi isimlerine uyan bütün kodu etkileyebilirler; o isimler iç kapsamlarda olsalar bile... C makroları kapsamlardan habersizdirler. Bu, kod sağlığına aykırı olarak kabul edilir. D katmaları ise normal dil kurallarına uyarlar ve bu açıdan sağlıklıdırlar.
- C önişlemcisi ifadelerinin söz dizimleri ve anlamları C dilinden farklıdır. C önişlemcisi ayrı bir dil olarak görülebilir. D'nin katmaları ise aynı dilin parçalarıdırlar.
- C önişlemcisinin C'nin
const
belirteçlerinden ve C++'nın şablonlarından haberi yoktur. D'nin katmalarında ise şablonlar veconst
belirteçleri kullanılabilir.