Thread overview
typeof(return) imkani ve function templateleri uzerine
May 14, 2014
Mengu
May 14, 2014
Mengu
May 14, 2014
Mengu
May 14, 2014

bugun std.array kodunu incelerken https://github.com/D-Programming-Language/phobos/blob/master/std/array.d#L125-L128 su satirlara denk geldim ve acikcasi bunu bilmiyordum. pek hosuma gittigini soylemeliyim. fonksiyon icerisinde return type'i bilebilmek ve hatta onu dinamik bir bicimde static bir dilin icinde kullanmak hosuma gitti. bu d dokumanlarinin adam akilli hale getirilmesi lazim. declarations kisminda bu yaziyor ama her sey ufak tefek, kenarda kosede kaldigi icin hic gormemisim acikcasi veya yeni yazdilar. :)

bir de std.net.curl kodunu inceliyordum orada da karsima su metod cikti: https://github.com/D-Programming-Language/phobos/blob/master/std/net/curl.d#L239-L243. burada da yeni ogrendigim bir sey oldu; d'de typelari fonksiyon argumani olarak kullanamiyormusuz. kullanmak istedigimiz zaman da function template'i yazmak durumundayiz buradaki gibi. burada da merak ettigim tek nokta neden enum kullanildigi.

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

May 14, 2014

Alıntı (acehreli):

>

Alıntı (Mengu):

>

fonksiyon icerisinde return type'i bilebilmek ve hatta onu dinamik bir bicimde static bir dilin icinde kullanmak hosuma gitti.

İşin içinde şablon olunca dönüş türü şablonun parametrelerine bağlı olabiliyor. O yüzden typeof(return) neredeyse şart.

Alıntı:

>

d'de typelari fonksiyon argumani olarak kullanamiyormusuz.

Bu, C ve C++'tan beri gelen bir durum. Fonksiyonlar değer alırlar ama türler değer değildir diye...

Alıntı:

>

neden enum kullanildigi.

> private template isCurlConn(Conn)
> {
>     enum auto isCurlConn = is(Conn : HTTP) ||
>         is(Conn : FTP) || is(Conn : AutoProtocol);
> }
> ```

>
> isCurlConn bir *eponymous template* çünkü içindeki tek tanımın ismi şablonun ismiyle aynı. Böyle şablonlarda şablonun kullanımı şablonun içindeki o tek tanım yerine geçer.
>
> enum, o değerin derleme zamanında hesaplanmasını ve C makrolarına benzer biçimde kullanımını sağlıyor. Örneğin, kod içinde isCurlConn!A yazıldığı zaman kodun içine ya false gömülecek ya true. Bir başka deyişle, isCurlConn!A bir *hazır değer* oluyor. Değişken değil, adresi alınamaz, vs.
>
> Ali
>

c ve c++ programcisi olmadigim icin bu noktayi bilmiyordum. bir kac jvm dilinde oradan oraya type bilgisi tasimak mumkun, d'de olmamasi sasirtti beni. :)

butun olay enum'da mi bitiyor? sadece boolean bir deger olarak verilseydi yine derleme zamani expression false veya true'ya cevrilmeyecek miydi?

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

Alıntı (acehreli):

>

Alıntı (Mengu):

>

sadece boolean bir deger olarak verilseydi yine derleme zamani expression false veya true'ya cevrilmeyecek miydi?

Bu örnekte öyle hatta çoğu başka örnekte de öyle olabilir. Ama bool değişken olarak tanımladığın zaman teoride bellekte yeri olan bir değişken haline gelir. Sonra onu programda kullandığın her yerde o bellekteki yerinden bakılıp okunması gerekir çünkü son okunduğundan bu yana değişmiş olabilir.

Tabii, derleyici o değişkenin hiç değişmediğini görüp yerine false veya true değer de kullanabilir ama bunlar teoride öyle. enum yapınca derleme zamanı değeri olduğunu tam bilmiş oluyorsun.

Başka bir fark da değişkenin adresidir: enum olduğunda adresi de alınamaz çünkü yeri yoktur, yalnızca değerdir.

Ali

anladim. tesekkurler. :)

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

May 14, 2014

Alıntı (Mengu):

>

fonksiyon icerisinde return type'i bilebilmek ve hatta onu dinamik bir bicimde static bir dilin icinde kullanmak hosuma gitti.

İşin içinde şablon olunca dönüş türü şablonun parametrelerine bağlı olabiliyor. O yüzden typeof(return) neredeyse şart.

Alıntı:

>

d'de typelari fonksiyon argumani olarak kullanamiyormusuz.

Bu, C ve C++'tan beri gelen bir durum. Fonksiyonlar değer alırlar ama türler değer değildir diye...

Alıntı:

>

neden enum kullanildigi.

private template isCurlConn(Conn)
{
   enum auto isCurlConn = is(Conn : HTTP) ||
       is(Conn : FTP) || is(Conn : AutoProtocol);
}

isCurlConn bir eponymous template çünkü içindeki tek tanımın ismi şablonun ismiyle aynı. Böyle şablonlarda şablonun kullanımı şablonun içindeki o tek tanım yerine geçer.

enum, o değerin derleme zamanında hesaplanmasını ve C makrolarına benzer biçimde kullanımını sağlıyor. Örneğin, kod içinde isCurlConn!A yazıldığı zaman kodun içine ya false gömülecek ya true. Bir başka deyişle, isCurlConn!A bir hazır değer oluyor. Değişken değil, adresi alınamaz, vs.

Ali

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

May 14, 2014

Alıntı (Mengu):

>

sadece boolean bir deger olarak verilseydi yine derleme zamani expression false veya true'ya cevrilmeyecek miydi?

Bu örnekte öyle hatta çoğu başka örnekte de öyle olabilir. Ama bool değişken olarak tanımladığın zaman teoride bellekte yeri olan bir değişken haline gelir. Sonra onu programda kullandığın her yerde o bellekteki yerinden bakılıp okunması gerekir çünkü son okunduğundan bu yana değişmiş olabilir.

Tabii, derleyici o değişkenin hiç değişmediğini görüp yerine false veya true değer de kullanabilir ama bunlar teoride öyle. enum yapınca derleme zamanı değeri olduğunu tam bilmiş oluyorsun.

Başka bir fark da değişkenin adresidir: enum olduğunda adresi de alınamaz çünkü yeri yoktur, yalnızca değerdir.

Ali

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