Alıntı (canalpay):
>
- cast olanağı ile to şablonun farkı var mı da 2'sini koyuyorlar.( Bunda bir fark olabilir.)
'cast', C'den beri gelen bir olanak. C'de yalnızca temel türlerle çalışır. C++'da ise sınıfları istediğimiz her türe dönüşebilecek şekilde yazabilirdik.
D'de de bu dönüşüm 'cast' ile devam ediyor. Ama C++'dan daha kısıtlı: sınıflar için yalnızca tek bir dönüşüm işleci tanımlanabiliyor.
'to' şablonu ise her türü her türe dönüştürebilecek genel bir anlaşma gibi düşünülebilir. Ne kadar ilgisiz olsalar da kendimiz de tanımlayabiliriz.
Aşağıda 'to' şablonu özelleştirmesini (specialization), 'birDeğer' isminde üyesi olan herhangi bir türden 'Masa' nesnesi oluşturacak şekilde yazdım.
Oradaki 'if' ifadesini de 'dmd/src/phobos/std/conv.d' dosyasını inceleyerek öğrendim.
import std.cstream;
import std.conv;
class Masa
{
int i_;
this(int i)
{
dout.writefln("Masa.this ", i);
i_ = i;
}
}
class Okyanus
{
const int birDeğer()
{
dout.writefln("Okyanus.birDeğer");
return 42;
}
}
class Duvar
{
const int birDeğer()
{
dout.writefln("Duvar.birDeğer");
return 100;
}
}
class UyumsuzTür
{}
Masa to(Masa, S)(const ref S kaynak)
if (is (typeof(&S.init.birDeğer)))
{
return new Masa(kaynak.birDeğer());
}
void main()
{
auto o = new Okyanus;
auto d = new Duvar;
auto u = new UyumsuzTür;
Masa mo = to!Masa(o);
assert(mo.i_ == 42);
Masa md = to!Masa(d);
assert(md.i_ == 100);
// Masa mu = to!Masa(u); DERLEME HATASI
}
Alıntı:
>
- std.stream.File ile std.stdio.File farkı( Hadi bunda çok fark var. Ama neden iki tane file aracı var. stream'i kabul et işte. )
Benim anladığım kadarıyla, 'std.stdio.File' C'nin 'FILE' yapısı etrafında bir sarma. Yapı olarak gerçekleştirilmiş.
Ben 'std.stream.File''da karar kıldım, çünkü hem sınıf olduğu için daha yetenekli; hem de 'dout' ile aynı şekilde çalışıyor. Tek bir arayüz öğrenmek bütün akımlar için yeterli oluyor.
Alıntı:
>
- std.stdio.write() ile std.cstream.writef() farkı. (Ben bunların kaynak koduna baktığımda ikisininde C'den sarmalandığını hatırlıyorum. Ee ne farkı var. Hadi yanlış hatırlıyorum. )
Ne olursa olsun, ben 'cstream' arayüzünü daha genel ve daha D'ce buluyorum.
Alıntı:
> 4.write ile writeln farkı. (aynı şey. Sadece işlevin argümanına \n karakteri ekliyor. Ben beceriksizim ama bir \n ekleyemeyecek kadar beceriksiz miyim ? Hadi bunu eklemese ben kendim ekleyeceğim. Beni düşünmüşsün eklemişsin ama daha eklenecek o kadar özellik var, daha senin dünya kadar hatan var. Niye bunlarla uğraştığın kadar kütüphaneni zenginleştirmek için uğraşmıyorsun.
Haklısın. Ama gerçekten yazdırılanların çoğunun sonunda '\n' oluyor. Amaç, çok yapılanları kolaylaştırmak, az yapılanlara da kapı açmak olmalı.
Ayrıca, eskiden bir yerde okuduğum bir yazıya göre, metin işlemenin birimi aslında satırdır. (Yazarın fikri.)
Başka bir bakış açısı: eğer "satır oku" diye bir işlev varsa, bütünlük açısından onun karşıtı da olmalı.
Hatta, amacımızı '\n' gibi kodlarla belirtmek yerine işlevin ismini açık hale getirmek daha yararlı. (Ama 'ln' gibi bir ek o kadar da açık etmiyor. :D )
Alıntı:
> Tangoya öylesine baktım, kod düzeni bile çok iyi. Sanki adamlar kod yazmıyor resim çiziyor. ( Doğrusu resim çizerek kodlanan programlama dili vardı. Bilmem ne çiziyorsun hello world diyordu :-) )
Ben Tango'ya henüz bakmadım.
Phobos'u yalnızca daha standart olduğu için seçmiştim. Andrei Alexandrescu şu sıralarda aralık kavramını (range) ekliyor. C++'ın STL'inin erişicileri (iterator) getirdiği kadar büyük bir değişiklik getirebilir. (Phobos'ta aralık örnekleri yazılmaya başlandı bile. Yapı taşları 'std.range' içinde...
Tabii Tango'yu da aralıklı hale getirebilirler. O zaman daha da güzel olur.
Alıntı:
> Ve anlamadığım Walter Bright ne için phobos kütüphanesini geliştiriyor ?
Şimdilerde Phobos'un tasarımı çoğunlukla Andrei Alexandrescu'nun. Başkaları da yardım ediyor ve katkıda bulunuyor.
Alıntı:
> Eğer sen phobos kütüphanesini geliştiriyorsan neden Tango kütüphanesi ile uğraşıyorsun (Ben bazı modüllerde Walter Bright'in adı geçtiğini hatırlıyorum. Hadi diyelim sadece phobostaki kodları aldı -ki ben böyle olduğunu zannetmiyorum. - ne için onları phobosu geliştirmeye davet etmiyorsun yada ne için onların projesine katılmıyorsun. (Ee belki fikir ayrılıkları var. Ama bu belkilerin hepsi tutacak mı ? İlla ki tutmayanlar olacak. )) ? Bunu merak ettim.
Değişik insanlar değişik taraflara yöneliyorlar; değişik fikirleri var. Normal. Biraz da politik olmalı...
Alıntı:
> Ve birde sorum ,sadece meraktan soruyorum, D ile(sadece phobos kütüphanesini kullanarak) aklımıza gelen herşeyi teorikte yapabilir miyiz ?
Teoride herşeyi yalnızca D'nin (ve başka dillerin) iç olanaklarıyla da yapabiliriz.
Standart kütüphaneler fazla özel de olmamalılar zaten. Örneğin DNA işlemleriyle ilgili kütüphaneleri içermemeliler.
Bence Phobos gayet kapsamlı bir kütüphane. Hatta zipleme gibi özel amaca yönelik modüllerin olması biraz şüpheli bile.
C++'tan düşünüyorum: Standart kütüphanesi algoritmalar ve veri yapıları açısından oldukça yeterlidir ama eksiklikleri olduğu söylenir. Onun eksikliklerini kapatmak için Boost doğmuştur.
İçimden bir ses örneğin std.zip'in standart kütüphanede bulunmaması gerektiğini söylüyor, ama bulunursa da ihtiyacı olanlar için standart bir temel oluşturmuş oluyor.
D'de daha çok bir "pratiklik" hakim. "Koyalım, işe yarasın" gibi bir yaklaşım var. Yararlı; ama tutarsızlık da getiriyor.
Phobos'ta olmayan bir şey: pencereleme modülleri. Olmalı mı? Bilmiyorum. :D
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]