Forum: Ders Arası RSS
Resmi D Dili Örnekleri
dlang.org official site samples...
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Resmi D Dili Örnekleri
Merhaba,

Bugün bir ara, resmi sitenin ana sayfasındaki örnekler (diğerleri tıklayınca açılıyor) ilgimi çekti...

Örneğin şu bizi karşılayan koda anlam veremedim. Çünkü ortalamanın ekrana basıldığı satırı foreach() kümesi içinde yazmamız gerekmez mi? Öyle ya, döngüden nasıl çıkacak ki...:)
#!/usr/bin/rdmd
// Computes average line length for standard input.
import std.stdio;
 
void main() {
    ulong lines = 0;
    double sumLength = 0;
    foreach (line; stdin.byLine()) {
        ++lines;
        sumLength += line.length;
    }
    writeln("Average line length: ", 
        lines ? sumLength / lines : 0);
}
Yukarıdaki koddaki stdin.byLine(), standart girişten karakter okuyor ve siz enter'a basana kadar döngü bekliyor. Bu arada line.length ise enter'a basılana kadar (enter karakteri hariç) girilen tüm karakterleri topluyor. Son satır da malumunuz, (eğer döngüden çıkarsa!) ekrana ortalama basılıyor. Olası, sıfıra bölme hatası olmaması için de üçlü işleç kullanılmış.

İsterseniz diğerlerini de birlikte inceleyip tartışalım, ne dersiniz?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sen şimdiye kadarki satırların ortalamasını düşünmüş olmalısın. foreach'in içinde olsa her satırda ortalamayı tekrar hesaplar ve yazar. Ama bu program ortalamayı bütün girişin sonunda hesaplıyor.

Salih Dinçer:
döngüden nasıl çıkacak ki...:)

Giriş konsol ise, girişi sonlandırmak için Linux'ta Ctrl-D'ye, Windows'da Ctrl-Z'ye basılır. Tabii girişin konsol olması gerekmez; bu programı herhangi bir dosyanın içindeki satırların ortalaması için de kullanabiliriz:

$ bu_program < bir_dosya.txt

Veya başka bir programın çıktısındaki satırların ortalaması:

$ baska_program | bu_program

stdin.byLine(), standart girişten karakter okuyor ve siz enter'a basana kadar döngü bekliyor.

Başka bir deyişle girişi bir "satır aralığı" olarak sunuyor. O aralığın her elemanı bir satır.

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bilgilendirme için teşekkürler, hiç CTRL+D'ye basmak aklıma gelmemişti... :blush:

İşin ilginci, programın break olmuş gibi çıkması ve son satırda sanki scope(exit) yapılmış gibi devam etmesi. Bu bana şimdi gerçekten ilginç geldi ve hakikaten CTRL+D yaptığımda, komut satırının bir üstünde ortalama değeri gösteriyor. Açıkçası bugüne kadar yazdığım programlarda, CTRL+D'nin böyle bir yan etkisi olduğunu bilmiyordum. Hoşmuş...:)

Bu arada diğer örneğe kısaca değinirsek başka bir hoşluk ile karşılaşıyoruz: Farlı veri türlerini (soldaki lhs "double" türünde sağdaki rhs "int" türünde) karşılaştırma...
import std.stdio;
 
void main() {
    auto arr = [ 1, 2, 3.14, 5.1, 6 ];
    auto dictionary = [ "one" : 1, "two" : 2, "three" : 3 ];
    auto x = min(arr[2], dictionary["three"]);
    
    writeln(x);
}
 
auto min(T1, T2)(T1 lhs, T2 rhs) {
    return rhs < lhs ? rhs : lhs;
}
Bu arada kodu biraz değiştirdim! Açıklamaları silip yerine ekrana x'i yazan bir satır ekledim. Hemen yukarıdaki işlev, üçlü işleç sayesinde her zaman için hangisi küçükse onun değerini gönderiyor.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
acehreli:
Giriş konsol ise, girişi sonlandırmak için Linux'ta Ctrl-D'ye, Windows'da Ctrl-Z'ye basılır. Tabii girişin konsol olması gerekmez; bu programı herhangi bir dosyanın içindeki satırların ortalaması için de kullanabiliriz:...
İşte, 3. örnekte scope(exit) kullandığı gibi ilk örneke neden CTRL+D'deye bastığımızda program olduğu yerde sonlanmaz da foreach() kümesinden çıkıp son satırı işletir? Tabi aşağıdaki örnekte her şey istediğimiz gibi çalışmakta...
import std.stdio;
 
class Widget { ... }
 
void main() {
      // Automatically managed.
      auto w = new Widget;
      // Code is executed in any case upon scope exit.
      scope(exit) {
            writeln("Exiting main.");
      }
      // File is closed deterministically at scope's end.
      foreach (line; File("text.txt").byLine()) {
            writeln(line);
      }
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
Salih Dinçer:
İşin ilginci, programın break olmuş gibi çıkması ve son satırda sanki scope(exit) yapılmış gibi devam etmesi.

break olmuş gibi düşünmekten çok, girişin sonuna gelinmesi diye düşünmek daha doğru. (Zaten Ctrl-D de onu yapar: girişi sonlandırır.) byLine() aralığı da girişin sonuna kadar ilerlediği için foreach normal olarak sonlanıyor ve bir sonraki satıra geçiliyor. Yani programdan çıkmaya benzer bir şey değil; yalnızca girişin sonu...

auto min(T1, T2)(T1 lhs, T2 rhs) {
    return rhs < lhs ? rhs : lhs;
}

Ne kadar basit, değil mi? Zaten de öyle olması gerekir. Aslında o da D'nin bazı başka dillerle karşılaştırılınca ne kadar güçlü olduğunu gösteren bir örnek. Andrei'nin "Three Cool Things About D" sunumunun 24/39 numaralı slaydında C++'ta nasıl olduğu vardır:

template <class T>
T& min(T& lhs, T& rhs) {
    return rhs < lhs ? rhs : lhs;
}
template <class T>
const T& min(const T& lhs, const T& rhs) {
    return rhs < lhs ? rhs : lhs;
}

Aynı slayt C++ çözümü için şunları söyler:

  • İşlev tam değildir

  • Tam olabilmesi için yazılan N2199 numaralı öneri 175 satırdan oluşur, 10 tür içindir, ve 12 özelleme içerir. Sonuçta o öneri reddedilmiştir.

Ali
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Zaten Ctrl-D de onu yapar: girişi sonlandırır.
Tamam, şimdi oldu Eti Eti Eti...:)
(Reklam cıngılına gönderme...)

Sanırım ben CTRL+C ile D'yi karıştırmışım. Bazen C dili ile D dilini karıştırdığım gibi...:)
acehreli:
Ne kadar basit, değil mi? Zaten de öyle olması gerekir. Aslında o da D'nin bazı başka dillerle karşılaştırılınca ne kadar güçlü olduğunu gösteren bir örnek.
Gerçekten de öyle! C++'da ise önerinin reddedilmesi belki de işlevin karmaşıklaşmasından dolayı olsa gerek. Herhalde, beraberinde tüm dili baştan aşağı değiştirecek bazı özelliklerde gelecekti; şablon ile uğraşınlar demiş olmalılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Sanırım ben CTRL+C ile D'yi karıştırmışım. Bazen C dili ile D dilini karıştırdığım gibi...:)

Ha ha! :D Onu sevdim...

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 00:21:37 (UTC -08:00)