Forum: Duyurular RSS
DMD 2.052 çıktı!
canalpay (Moderatör) #1
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: DMD 2.052 çıktı!
Yeni/Değişen Özellikler:

-Linux için 64 bit desteği

-Uygulanan exception chaining, TDPL'de açıklanan  Şu anda yalnız windows için. (Ne olduğunu bilmiyorum.)

-std.random: rasgele Xorshift üreticisi eklendi.

-Html5 elemanlarına destek.(Web framewrok için bir işe yarar mı?)

-Tarihler ve saatler kullanım için std.datetime eklendi.(Diğerleri yani std.date ve std.gregorian önerilmiyor.)

-Std.file Çeşitli fonksiyonları (isfile yerine isFile gibi) Phobos'un adlandırma kurallarına uygun olarak yeniden adlandırıldı.(Eski adların kullanılması önerilmiyor.)

Bir çok hata düzeltilmesi var.

Değişikler tam liste :http://www.digitalmars.com/d/2.0/changelog.html
İndirme Bağıntısı    :http://www.digitalmars.com/d/download.html
Kadir Can #2
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
HTML5 desteği helper kısmında işe yaramaz.Çünkü her fonksiyonda uygun kod parçacığını elle oluşturuyoruz.

Öbür kısımlarda HTML5'in işe yarayacağını zannetmiyorum.
acehreli (Moderatör) #3
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ı
std.xml modülüne şöyle bir baktım. Ne kadar kapsamlı... :) Kullanışlılığı konusundan hiçbir fikrim yok ama kod iyi ve okunaklı yazılmış.

Ali
canalpay (Moderatör) #4
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu sürüm sanki dersanedeki cstream kodlarının kalkması gerektiğini veren bir sinyali gibi değil mi :-p

Örn: Kadir Can'ın hatırlattığı karakterler dersinin 3.sorusunun yanıtı doğru çalışmıyor. Artık şöyle olması gerekiyor:
import std.stdio;
import std.uni;
 
void main()
{
    dchar harf;
    dchar sonuç;
 
    write("Dönüştürülecek harf? ");
    readf("%s",&harf);
 
    if (isUniLower(harf)) {
        // Küçükmüş; büyütmemiz gerekiyor; i'yi kendimiz
        // dönüştürmeliyiz
 
        if (harf == 'i') {
            sonuç = 'İ';
        } else {
            sonuç = toUniUpper(harf);
        }
 
        writeln("Büyüğü: ", sonuç);
 
    } else if (isUniUpper(harf)) {
        // Büyükmüş; küçültmemiz gerekiyor; I'yı kendimiz
        // dönüştürmeliyiz
 
        if (harf == 'I') {
            sonuç = 'ı';
        } else {
            sonuç = toUniLower(harf);
        }
 
        writeln("Küçüğü: ", sonuç);
 
    } else {
        writeln("HATA: ", harf, " bir harf değil");
    }
}

Bu arada Andrei Alexandrescu'nun röportajını okumaya çalışıyordum. Orada D3 gibi bir şey planlamadıklarını söylüyordu sanırım. Tam ona sevinecektim ki sonra farkettim. D3'e gerek yok. Şuan bile her sürümde bizim projeler derlenemez hale geliyor. :-p Yani ben Tangocu larsiviye neden D2'ye taşımıyorsunuz dediğinde verdiği yanıt gibi oldu bu sürüm :-D

Etkilen projeler: dkv(ve tabiki üst sürüm dkvG). trileri. ve turnada çok basit bir hata vardı. Onu saymasakta olur :-D
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ı
Ben cstream'i kaldırmaya 2.051'de başlamıştım ama bir noktadan ileriye gidememiştim. Durum 2.052'de daha iyi ama doğrusu inanılmaz hatalar da var. Kızıyorum ama kızmaya hakkımız da yok gibi geliyor. Bedava bir ürün alıp oynuyoruz; kızmaya hakkımız var mı? Veya ben niye bu güne kadar oturup stdin'den okuma işini kendim halletmedim?

Şu kod ikinci sayıyı okuyamıyor:

import std.stdio;
import std.conv;
 
void main()
{
    foreach (i; 0..3) {
        int sayı;
        writef("%s: Lütfen bir sayı girin: ", i);
        readf("%s", &sayı);
        writefln("   Okudum: %s", sayı);
    }
}

Nedeni, C'den beri bilinen davranış: bir önceki girilen sayının sonundaki '\n' karakteri hâlâ girişte durduğu için onunla başlayan karakterler int olarak okunamıyorlar.

Çözüm, C'nin scanf'inde de olduğu gibi " %s" kullanmak. Düzen dizgisi içindeki boşluk karakteri bütün boşlukları (tab ve '\n' dahil) yutar. O zaman çalışıyor. Tamam, bu o kadar önemli bir konu değil; anlatılır. (Sanırım artık ddio.d modülünün Phobos'a alınmasını teklif edeceğim; bu kadar beklediğim kabahat. (Ama siz bana söylemiştiniz. :)))

Asıl önemli hata şu:

import std.conv;
import std.string;
 
void main()
{
    char[] giriş = "1.5e3".dup;
    double beklenen = 1500;
    double d = parse!double(giriş);
    assert(d == beklenen, format("%s umduk; %s çıktı", beklenen, d));
}

O program şu hatayla sonlanıyor:

core.exception.AssertError@deneme.d(27781): 1500 umduk; 15 çıktı

Dün akşam kapsamlı bir birim testi yazmaya başladım. Bir hata açıp "şu birim testlerinin hepsinin geçmesi gerekiyor" diyeceğim.

Kendim çözebilirsem kod değişikliğini de hataya ekleyeceğim.

Ali
canalpay (Moderatör) #6
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bedava bir ürün alıp oynuyoruz; kızmaya hakkımız var mı?

Yok ama biz de o kadar emek harcıyoruz(Tamam kabul biz değil :-D Siz. ). Eğer onların işine gelmese neden bedava sunsunlar? diye sorulabilir. (
Ayrıca para vermiyoruz demek hatta emek vermiyoruz demek bedava kullanıyoruz demek değildir! Eğer biz kullanmasak onlarda yapmayacaktı. Demek ki bizden bir çıkarları vardır. Egodan başka bir şey :-) ) Onlar başka bir şey der bizde başka bir şey. Bu konu uzar hatta çocukca bir hal alır :-) Ancak tabiki onlar düzeltmeye çalışıyor. Bizde kullanmaya. O zaman sorun yok. Nerden geldik ki bu konuya :-p

import std.conv;
import std.string;
 
void main()
{
    char[] giriş = "1.5e3".dup;
    double beklenen = 1500;
    double d = parse!double(giriş);
    assert(d == beklenen, format("%s umduk; %s çıktı", beklenen, d));
}

Bende olması gerektiği gibi çalışıyor :-D Hatta e+ ve e- ilede denedim yine olması gerektiği gibi çalıştı :-)

Ancak şu biçimde derleyemedim. dup ile ilgili unuttuğum ne var ki anlayamadım.:

    double f = parse!double("1.5e3".dup);


Dün akşam kapsamlı bir birim testi yazmaya başladım. Bir hata açıp "şu birim testlerinin hepsinin geçmesi gerekiyor" diyeceğim.

Göndermeden bir gün önce bizede göstrerirseniz belki bizimde aklımıza bir iki şey gelir ve ekleriz. Belki.

(Sanırım artık ddio.d modülünün Phobos'a alınmasını teklif edeceğim; bu kadar beklediğim kabahat. (Ama siz bana söylemiştiniz. :)))

Yok ancak sizde haklıydınız. Dedikleriniz:
Bu konudaki bir soruyu çözemiyorum: C ve C++ gibi, D'de de aslında konsol diye bir kavram yok. Var olan, standart giriş ve standart çıkış akımları. (Bunları daha önce konuştuğumuzu biliyorum.)

O akımların klavye ve ekrana bağlanmaları, programı başlatan ortamın bir marifeti.

Sonuçta, konsol diye bir kavrama sahip olmayan bir dilin standart kütüphanesinde bir insanla konsoldan iletişime yönelik modüller bulunmalı mı?

Bence bulunmamalı. Zaten herhalde o yüzden de C ve C++'ta da yok.

İşte böyle bir çelişki içindeyim. :)

Başka bir sakınca, ya programı başlatan kişi programın çıktısını başka bir dosyaya gönderdiyse? Bizim programımızın bundan haberi olmuyor. Biz ekrana "Yaşınız kaç?" diye sorsak, konsolda oturan insan bunu görmüyor.

Bence en doğrusu Phobostan farklı ikinci bir kütüphane daha yazılması. Bu standart kütüphanede bulunmaması gereken özel sorunlar ve çözümler için kullanılabilir. Aslında bunun hakkında Andreinin ve bir kaç tango geliştiricisinin fikri alınabilir. Yoksa biz burada sadece bir çok şey için eklenmeli ya da eklenmemeli diye papatya falı bakacağız.
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ı
canalpay:
import std.conv;
import std.string;
 
void main()
{
    char[] giriş = "1.5e3".dup;
    double beklenen = 1500;
    double d = parse!double(giriş);
    assert(d == beklenen, format("%s umduk; %s çıktı", beklenen, d));
}

Bende olması gerektiği gibi çalışıyor :-D Hatta e+ ve e- ilede denedim yine olması gerektiği gibi çalıştı :-)

Yani d'nin değeri 1500 mi oldu? Güzel. :) Ben 64 bitlik Ubuntu üzerinde .deb pakedinden 2.051 kurmuştum. 2.052'yi ise .deb pakedini göremediğim için bir klasöre açarak kurdum. (Şimdi baktım: .deb pakedi hâlâ yok.)

Belki de benim tarafta klasör karışıklıkları ile ilgili bir durumdur. Biraz daha deşeceğim.

Ancak şu biçimde derleyemedim. dup ile ilgili unuttuğum ne var ki anlayamadım.:

    double f = parse!double("1.5e3".dup);

Şu şekilde yanıt vermeye başlamıştım ama ispatlayamadığımı farkettim. Bu bilgiler doğru ama ilgisiz de olabilir:

parse, yan etkisi olan bir işlev olduğunu belgeliyor. İşini yaparken kendisine verilen dizgiyi tüketir. Böylece çağıran taraf parse'ın okuduğu yerden ve belki de başka biçimde devam edebilir.

Yukarıdaki kullanımda parse'a gönderilen parametre bir geçici değişkendir. C++'dan gelen bir kural: "geçici nesneler, const olmayan referanslara bağlanamazlar" (temporaries cannot be bound to non-const references).

Aslında daha doğrusu, "geçici nesneler" değil, "rvalue'lar"dır. Yani "rvalue'lar const olmayan referanslara bağlanamazlar." Ama yukarıdaki gibi "geçici nesne" örnekleri anlatım açısından yeterli oluyor.

Bu kuralın nedeni şu: parametre const olmadığında işlevin onda değişiklik yaptığı düşünülüyor. Geçici nesneler durumunda ise o değişikliklerin çağıranın tarafında görülebilmesi olanaksız. Örneğin senin yukarıdaki satırında parametre olarak giden değişkende oluşan değişiklikleri, işlev döndükten sonra gözlemleyemeyiz. Oyüzden ben 'giriş' diye bir değişken kullanmak zorunda kaldım. (Benimki rvalue değil, lvalue olmuş oldu.)

Zaten özellikle bu konuyla ilgili olarak, işlev parametrelerini olabildiğince 'const' seçmemiz gerekir. Yoksa işlevin kullanışlılığı azalır. Yanlış tasarlanmış bir işlev:


Konunun onunla ilgisi var ama kendi yazdığım işlevlerde aynısını gözlemleyemiyorum. .dup'un bir özelliği ile ilgili olabilir. Öğrenince yazacağım. Ya da hızlı olsun istersen sen D.learn'e sor. :)

Ali
canalpay (Moderatör) #8
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konunun onunla ilgisi var ama kendi yazdığım işlevlerde aynısını gözlemleyemiyorum. .dup'un bir özelliği ile ilgili olabilir. Öğrenince yazacağım. Ya da hızlı olsun istersen sen D.learn'e sor. :)

Kendi yazdığınız işlevide buraya koyarsanız onuda, ama bakın bu çalışıyor diye koyarım.
acehreli (Moderatör) #9
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ı
Gerek kalmadı çünkü aklım başıma geldi. :)

Yukarıda anlattıklarım geçerli. Aynı durumu kendi işlevimizde görebilmek için parametresini ref yapmak gerekiyor.

void noktala(ref char[] metin)
{
    metin ~= '.';
}
 
void main()
{
    noktala("merhaba".dup);
}

O kod derlenemez çünkü .dup'un döndürdüğü char[]'da yapılan değişikler kaybedilir. C++'da olduğu gibi, dil buna izin vermiyor. İşlevin bir lvalue ile çağrılması için:

    char[] d = "merhaba".dup;
    noktala(d);

O çalışıyor.

Ali
acehreli (Moderatör) #10
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 #6
canalpay on 2011-02-20, 09:27:
import std.conv;
import std.string;
 
void main()
{
    char[] giriş = "1.5e3".dup;
    double beklenen = 1500;
    double d = parse!double(giriş);
    assert(d == beklenen, format("%s umduk; %s çıktı", beklenen, d));
}

Bende olması gerektiği gibi çalışıyor :-D Hatta e+ ve e- ilede denedim yine olması gerektiği gibi çalıştı :-)

dmd'yi -m64 seçeneği ile mi çalıştırıyorsun? Öyle yapınca bende de doğru çalışıyor. -m64 kullanmayınca çıktı şu:

core.exception.AssertError@deneme.d(28123): 1500 umduk; 15 çıktı

İşin garibi dmd'nin ekrana döktüğü seçenekler arasında -m64 yok! :-/ Ama şu sayfada var:

  http://www.digitalmars.com/d/2.0/dmd-linux.html

Amatör bunlar... ;)

Ali
acehreli (Moderatör) #11
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ı
Daha da anladım: Sorun, -O -m32 seçenekleri birlikte kullanılınca ortaya çıkıyormuş. Aslında -m32 varsayıldığı için yalnızca -O yazmak hatayı görmeye yetiyor.

İki hata raporu açtım:

1) Komut satırı seçenekleri dmd çıktısında ve sitede tutarsızlar (örneğin -m64 seçeneği komut satırında 'dmd' yazınca listelenmiyor):

  http://d.puremagic.com/issues/show_bug.cgi?id=5648

2) std.conv.parse -O -m32 ile derlendiğinde kesirli sayılarda hatalı:

  http://d.puremagic.com/issues/show_bug.cgi?id=5649

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: Duyurular 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-19, 07:58:34 (UTC -08:00)