April 03, 2012

static if konusu üzerine kafa yoruyorum, halen tam anlamadım. Şöyle bir kod yazdım, düzgün bir şekilde çalışıyor.

module main;

import std.stdio;
import std.traits;
import std.process;

void main()
{
   TipGoster!(int)(42);

	system("PAUSE");
}

void TipGoster(T)(T deger)
{
	//static if (is(T :int))
	if (is(T :int))
	{
		writefln("-> %s", T.stringof);
	}
}

Biliyorum bu çok basit bir yaklaşım olacak ama static if yerine if kullanabiliyoruz. is metodunuda inceledim, nasıl gözden kaçırdığımada oldukça şaşırdım çünkü gerçekten bir çok kullanımı ve faydası olan güzel bir metot.

Sanırım ben tam olarak bu derleme zamanında işletilen kodların diğerinden farkını ayıramıyorum. Nedir bu derleme zamanında çalışan kod olayı, farkı nedir? Neden böyle bir şeye ihtiyaç duyarız, olumlu ve olumsuz yönleri nelerdir?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 03, 2012

Bahsedilen static if kavramı C'de olan ve derleme sırasında, tanımlanan makroya göre ilgili satıları açan veya kapayan #ifdef gibi değil mi? Sanki aralarında çok fazla bir fark yok gibi.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 03, 2012

Alıntı (zafer):

>

static if yerine if kullanabiliyoruz

static if, if kullanılamadığı zamanlar için değil. if her zaman kullanılabilmelidir.

Senin yukarıdaki if'in T'nin ne olduğuna bağlı olarak sonuçta ya şuna dönüşüyor:

   if (true)
   {
       writefln("-> %s", T.stringof);
   }

Ya da şuna:

   if (false)
   {
       writefln("-> %s", T.stringof);
   }

Yani, sonuçta oluşturulan kod içinde her zaman için bir if koşulu bulunuyor ve normalde, işlev her çağrıldığında o koşul işletiliyor. Şablonun kod üretmesi ile ilgili olan o.

Tabii derleyici int için koşulun her zaman true olduğunu görüp koşul denetimini bütünüyle kaldırabilir; veya başka bir tür için her zaman false olduğunu görüp tüm bloğu kaldırabilir. Ancak, bu konu eniyileştirme ile ilgilidir if veya static if ayrımı ile ilgili değildir.

Alıntı:

>

derleme zamanında işletilen kodların diğerinden farkını ayıramıyorum.

if'te koşulun derleme zamanında da bilinebileceğini ve derleyicinin belki de eniyileştirme yapabileceğini yukarıda yazdım. static if kullanıldığında ise koşulun derleme zamanında bilinmesi şarttır. Derleyici de kendisine kalmış eniyileştirmelerle uğraşmaz ve kesin bir davranışta bulunur:

  • koşul true ise blok koda dahil edilir

  • koşul false ise blok koddan çıkartılır

Bunun farkını bir türe üye eklerken görebiliriz:

bool birKoşul()
{
   return false;
}

struct S
{
   int i;

   static if (birKoşul()) {
       double d;
   }
}

void main()
{
   S s;
}

birKoşul() true olduğunda S'nin hem i hem de d üyeleri bulunur. birKoşul() false olduğunda ise yalnızca i üyesi bulunur.

Aynısını if ile yapamayız çünkü türün o üyesinin olup olmayacağına derleme zamanında karar verilmiş olması şarttır.

Yukarıda görüldüğü gibi ortada şablon olması da gerekmiyor. Ama 'static if' bütünüyle Andrei Alexandrescu'nun bastırması ile ortaya çıkmış bir kavramdır. C++11'i de Going Native 2012 konferansında 'static if'i hâlâ sunmadığı için eleştirdi. Kendisi C++'ın şablon olanağını akla gelmeyecek numaralarla kullanarak 'static if'i gerçekleştirmişti. Onun Loki kütüphanesinde kullanır ve Modern C++ Design kitabında anlatır.

static if, derleyicinin kod üretimi sırasında "eğer şöyleyse şunu da ekleyelim" diyebilme olanağı verir. Phobos'ta bir çok yerde geçer. Şu bölümün hemen başında da aralıklarla nasıl yararlı olduğunu göstermişim:

http://ddili.org/ders/d/araliklar_baska.html

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 03, 2012

Alıntı (Salih Dinçer):

>

#ifdef gibi değil mi?

Teşekkürler! :) Tabii #ifdef yalnızca başka makroların değerlerini kullanabilir ve #if dört işlem gibi yalnızca basit hesapların sonuçlarına bakabilir ama sonuçta mantık aynı.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 04, 2012

Alıntı (acehreli:1333472996):

>
> bool birKoşul()
> {
>     return false;
> }
>
> struct S
> {
>     int i;
>
>     static if (birKoşul()) {
>         double d;
>     }
> }
>
> void main()
> {
>     S s;
> }
> ```

>
> birKoşul() true olduğunda S'nin hem i hem de d üyeleri bulunur. birKoşul() false olduğunda ise yalnızca i üyesi bulunur.
>
> Aynısını if ile yapamayız çünkü türün o üyesinin olup olmayacağına derleme zamanında karar verilmiş olması şarttır.
>

Peki, örneğin birKoşul metodunun değeri çalışma zamanında belirlenseydi. O zaman static if kullanamazdık öyle değil mi?

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
April 05, 2012

Tam konuyla alakalı değil ama static kavramını yine bir struct içinde irdelediğim şu örneği paylaşmak isterim: http://codepad.org/tOnfGATY

Gerçi yeni bir başlık (no.770) (http://ddili.org/forum/thread/770) açarak uzun soluklu bir paylaşım niyetiyle Bismillah dedim...

Ancak yukarıda verdiğim bağlantı başlıktakinden farklı. Bu static ifadesi kaldırılarak (ve tabi sistem D1 derlediği için azıcık değiştirilerek) çalıştırılabilir halini verdim. Neyse, yine ben yazmadım farzedin siz çünkü JSON başlığını iyice dağıttık...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 05, 2012

Salih gerçekten JSON konusunu iyice dağıttık :) farkettim ki son zamanlarda bunu çok yapıyoruz :-D

Alıntı:

>

Tam konuyla alakalı değil ama static kavramını yine bir struct içinde irdelediğim şu örneği paylaşmak isterim: http://codepad.org/tOnfGATY

Neyse ben mesaj yazma sebebime geleyim, yukarıdaki kodu ilk gördüğümde senin yazdığına inanamadım. Tekrar mesaja döndüm tekrar okudum, bağlantıyı yanlış açmış olabileceğim için kapatıp tekrar açtım ama yine aynı kod karşımdaydı. Tıpkı bir şiir gibi, sıcak bir yaz akşamı yüzümüze çarpan meltem gibi, sakin sakin ama bir düzende akan bir nehir gibi sakin ve uyumlu bir kod parçası gördüm (Evet abartıyorum ama değer)

Nereden başlasam bilemiyorum ki, isimlendirmeler harika (başkasıMı enfes :)), işlem satırları arasındaki boşluklar estetik, metot parantezleri simetrik, işlem grupları hizalı ve birbilerine eşit mesafede, Çıktı formatları bile özenilerek hazırlanmış. Tek kelime ile kendi adıma tebrik etmek isterim seni Salih bence gerçekten şiir gibi bir kodlama olmuş.

Abarttım mı! evet ama yukarıdada belirttiğim gibi buna değer. Niasan ayının en güzel forum kodlaması olarak ben oyumu bu kod parçasına kullanırdım.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 05, 2012

Estağfurullah,

İlham geliyor yazıyorum işte. Hatta çıktı genişliğini denk getirmeye de uğraşmıyorum. Ama tüm kodları, göze güzel görünür şekilde yazmaya gayret ediyorum; derlenmiş haline hiç bir etkisi olmadığını bilsem de...:)

Bugün zaman olaylarına girdim de az önce bir örnek daha ekledim. Çok geniş ve tartışmalı bir sınıf şu std.datetime.
Alıntı (zafer):

>

farkettim ki son zamanlarda bunu çok yapıyoruz :-D
:-D

Teşekkürler...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 04, 2012

Doğru. Şu kod derlenemez:

void main(string[] parametreler)
{
   static if (parametreler.length == 5) {
   }
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 05, 2012

Salih, orada şöyle yazmışsın:

Alıntı:

>

Eğer static bir eleman varsa, kurucu this() olmalı

Kodda static üye göstermemişsin ama herhalde "n static olsaydı" demek istiyorsun. Herhalde bunları zaten biliyorsun :) ama static üyelerden bütün tür için yalnızca bir adet bulunur. On tane Hesaplamalar nesnesi bile olsa tek n olacaktır. static üye nesnelerin boyutlarına katkıda bulunmaz, farklı bir yerde tek başına yaşar.

static üyeler için de kurucu var ve ismi 'static this':

struct Hesaplamalar
{
   static int n;

   static this() {
       n = 42;
   }

   // ...
}

O kurucu tek kere işletilir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]