Jump to page: 1 2
Thread overview
with() Deyimi Örnekleri
Jun 15, 2012
Salih Dinçer
Jun 16, 2012
Salih Dinçer
Jun 16, 2012
Salih Dinçer
Jun 17, 2012
Salih Dinçer
Jun 19, 2012
Salih Dinçer
Aug 08, 2012
Salih Dinçer
Aug 09, 2012
Salih Dinçer
Jun 17, 2012
zafer
June 15, 2012

Merhaba,

Tek amacım karşılaştığım örnekleri bu başlıkta toplamak. Gerçi Ali hocam, 'with()' deyimine karışık duygular beslediğini ifade etmişti. Belki bu duygularını, bu vesileyle pozitife çevirebiliriz niyetindeyim. Hem D dilinin bu olanağını daha çok dillendirmiş ve haberdar olan sayısını arttırmış olacağız.

Aslında farkında olmadan ilk örneği keşfetmiş ve nakletmişim: İç içe with() deyimi... (http://ddili.org/forum/thread/839)

Peki ya buna ne demeli: İsimsiz Sınıf !!!

class S {
   int a;

   this() {
       a = 1;
   }
}

Yukarıdaki gibi basit bir sınıfımız olduğunu varsayalım. Hem geliştirme aşamasında hem de kullanım sırasında sık sık ismini yazmak yerine (çünkü bunun ismi tek haflik olmayabilirdi!) 'with()' deyimi ile isimsiz kullanabilir. Ama önce alıştığımız halini görelim:

void main() {
   auto i = new S();
   i.a.writeln;
   i.a = 10;
   i.a.writeln;
}

Gördüğünüz gibi satır sayısında bir değişiklik yok. Hatta güzel parantez ile arttığını da düşünebiliriz. Tek esprisi 'new' ile hafızada yeni yer açılan (kopyası mı Ali hocam?) sınıfı 'with()' ile kapsamamız ve bunu kümeleştirerek istediğimiz yere kadar uzatabilmemiz.

void main() {
   with(new S) {
       a.writeln;
       a = 10;
       a.writeln;
   }
}

Bu deyimi aşağıdaki gibi tek satır da kullanabiliyoruz ama sanki o zaman tüm esprisi gidiyor gibi, ne dersiniz? Gerçi biraz düşünürsek tek satırda (noktalı virgülü saymazsak) hiç bir zaman yapamayacağımız bir şey yapıyoruz...:)

   with(new S) a.writeln;

Bakın bu son söylediğimi ben de yeni farkettim! Aslında isteseydik 'this()' içinde benzer bir şey yapılabilirdi, bilemiyorum. Ne olursa olsun bu 'with()' deyimi gerçekten çok faydalı. Acaba başka dillerde bu olanka var mıydı?

Sevgiler, saygılar...

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

June 16, 2012

Anlıyorum...

Alıntı (acehreli):

>

Alıntı:

>

Acaba başka dillerde bu olanka var mıydı?

Galiba Pascal'da varmış.

Ali

Hayret, sıkı bir Pascal hayranıyım ama daha önce duymamıştım. Belki de o kadar derin ilgilenmemiş olabilirim. Oysa çok tatlı şeyler, özellikle işin için OOP varsa; ve ayrıca uzun başlangıç değerleri soldaki sütunun çoğunu götürüyorsa. Çalışmayan rasgele bir örnek vereyim:

'with'(foo.bar.icecream) diye tatlı mı tatlı bir nesnemiz (dondurmamız) olsun!

Biz önce bunu yiyeceğiz, sonra tat alma duyumuz ile beynimizde karmaşık bir işlem yapacağız ve gülümseyeceğiz...:)

with(foo.bar.cream) {
   eating(cup);
   parameter((sin.x / cos.x)*sqrt(2));
   smile();
}

Ne kadar hoş değil mi?

Çünkü odaklamanız gereken satırlar sağa doğru kaymayıp bir küme içerisinde (bunu OOP'da çok görüyoruz) satırları derli toplu hale getiriyoruz. JSON bunun bir örneği, bir de GtkD'ye bakalım...

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

June 16, 2012

Merhaba,

Şurada (http://ddili.org/ders/gtkd/pencere_kurma_islemleri.html) yer alan son örneği 'with()' ile aşağıdaki gibi derli ve toplu bir hale getirebiliriz:

import gtk.Window, gtk.Main, gtk.Widget, std.c.process;

int main(string[] args) {
   Main.init(args);

   with(new Window("[X] Düğmesine Bas ve Program Sonlandırılsın!")){
       setSizeRequest(450, 450);
       setResizable(false);
       addOnHide( delegate void(Widget aux){ exit(0); });
       show();
   }
   Main.run;
   return 0;
}

Tabi oluşturulan pencere nesnesini (burada isimsiz veya anonim görünmekte), küme dışında başka yerde kullanmayacağımızı da belirtmek isterim. Yani 'with()' ile beraber oluşturduğumuzda nesne orada oluşuyor. Peki ya ölüyor mu? Denemek lazım...:)

Başarılar...

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

June 16, 2012

Güzelmiş. :)

Alıntı (Salih Dinçer):

>

Tek esprisi 'new' ile hafızada yeni yer açılan (kopyası mı Ali hocam?)

Hayır, with kopyaya neden olmuor. Yalnızca 'a' gibi isimlerin nerede bulunacaklarını bildirmiş oluyoruz.

Ama söylediğini anlıyorum. Şu iki satır:

   with(new S) {
       writeln(&a);
       writeln(&a);
   }

aşağıdaki iki satırın eşdeğeri değil, çünkü aşağıdakinde iki nesne var; yukarıdakinde ise tek. Bunu a'ların adreslerini yazdırarak görebiliyoruz. Yukarıdakinde aynı adres, aşağıdakinde iki farklı adres var.

   with(new S) writeln(&a);
   with(new S) writeln(&a);

Alıntı:

>

Acaba başka dillerde bu olanka var mıydı?

Galiba Pascal'da varmış.

Ali

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

June 16, 2012

Alıntı (Salih Dinçer):

>

Yani 'with()' ile beraber oluşturduğumuzda nesne orada oluşuyor. Peki ya ölüyor mu?

Referans türlerinde nesne artık geçersizdir. Sonlandırıcı işlevi ilerideki belirsiz bir zamanda işletilir (veya hiç işletilmez).

Değer türlerinde ise sonlandırıcısı hemen çağrılır.

import std.stdio;

struct S
{
   int i;

   this(int i = 0) {
       writeln("kuruldu");
   }

   ~this() {
       writeln("sonlandı");
   }
}

void main()
{
   with(S(1)) {
       writeln("with içinde");
       i = 42;                  // <-- HATA
   }

   writeln("with dışında");
}

İsimsiz nesnenin yaşamı with'e girmeden sonlanıyor. Çıktısı:

'kuruldu
sonlandı
with içinde
with dışında
'

Görüldüğüne göre with nesnelerin yaşamlarını kendi bloğu kadar uzatmıyor. Bunun bir dmd veya tasarım hatası olup olmadığını bilmiyorum.

Buna bakarak, bence new ile oluşturulan nesnenin geçerliliği de with parantezinde son buluyor. Teorik olarak with'in bloğuna girmeden o da sonlanıyor olabilir.

Ali

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

June 17, 2012

Evet bunu ben de farkettim; 'with()' içinde struct kullanırken bir uyumsuzluk var...

Denediğim benzer bir örneği, yukarıdaki örneğe sınıf olarak uyarlarsak:

import std.stdio;

class S {
   static int i;

   this(int i = 0) {
       writefln("%s kurulduğu anda S.i = %d", this, i);
   }
    ~this() {
       writefln("%s silinmeden önce S.i = %d", this, i);
   }
}
void main() {
   with(new S(1)) {
       writefln("\twith() içindeyken i = %d @%x", i, &i);
       i = 42;
   }   writefln("\twith() dışındayken i = %d @%x", S.i, &S.i);
}/* Çıktısı:
struct2.S kurulduğu anda S.i = 1
	with içindeyken i = 0 @b786a6c8
	with dışındayken i = 42 @b786a6c8
struct2.S silinmeden önce S.i = 42
*/

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

June 18, 2012

Alıntı (acehreli:1339835525):

>

Galiba Pascal'da varmış.

Pascal'da olduğunu bende bilmiyordum. **With **ile ilk Delphi ortamında tanışmıştım yaklaşık D dilindeki gibi bir kullanıma sahip, sanırım başka dilllerdede benzerleri var. Örneğin C# tarafından sağlanan **using **olanağı bence with olanağının çok daha ilerisine geçmiş kullanışlı bir olanak temelde birbirinin eşdeğeri iki özellik aslında.

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

June 19, 2012

Teşekkürler Ali Hocam,

Sayende bir böcüğümüz oldu sonunda...:)

Şurada tartışma devam edebilir: http://forum.dlang.org/thread/jrqe6e$1gej$1@digitalmars.com

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

June 19, 2012

Alıntı (acehreli:1339867102):

>

Görüldüğüne göre with nesnelerin yaşamlarını kendi bloğu kadar uzatmıyor. Bunun bir dmd veya tasarım hatası olup olmadığını bilmiyorum.

D.learn haber grubunda da dmd hatası olduğu düşünüldü. Şu hatayı açtım:

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

Ali

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

August 08, 2012

Yeni şeyler öğrendim...:)

Paylaşmadan önce ihmal ettiğim eski bir örnek (hatta ilk!): with deyiminin switch ile kullanımı (http://ddili.org/forum/thread/804)

Bunu Ali hocam paylaşmıştı ve en üstte olmayı hak ediyordu. Örneğin itibarını az olsa iade etmiş oldum mu? Sanmıyorum ama bir hatam olduysa affola...

Alıntı (acehreli:1340135791):

>

Alıntı (acehreli:1339867102):

>

Görüldüğüne göre with nesnelerin yaşamlarını kendi bloğu kadar uzatmıyor. Bunun bir dmd veya tasarım hatası olup olmadığını bilmiyorum.
D.learn haber grubunda da dmd hatası olduğu düşünüldü. Şu hatayı açtım:
http://d.puremagic.com/issues/show_bug.cgi?id=8269

Bu hatayı araştırırken düzeltilmiş başka bir şu hatayı buldum:
http://d.puremagic.com/issues/show_bug.cgi?id=6128

Öyle sanıyorum ki bizim yayınladığımız destructed hatasına doğrudan bu hata etki ediyor. En azından düzeltme yapılan yerinde küçük bir püf noktası (while ile do while arasındaki nüans gibi) var. Her neyse with'in takipçisi olmaya devam edeceğim...:)

Bu vesileyle iki hatayı düzelttim daha doğrusu bunların hata olmadığını zannediyorum:
http://d.puremagic.com/issues/show_bug.cgi?id=1759
http://d.puremagic.com/issues/show_bug.cgi?id=8414

İlkinde bir delegate kurmuş ve int türünde işlev döndürmek istemiş. Ama bunu ters yapmış yani return'ü başta kullanacağına with'den hemen sonra icra etmiş. Bilemiyorum, derleyicinin kafası mı karışıyor...:)

struct SS{ int a, b, c; }
int delegate() addss(SS obj)
{
   with(obj) return {
       return a+b+c;
   };
}

Çünkü yeni olan ikinci örnekte de with'den sonra if kullanmış! Sanki birbirlerine benziyor ve küme parantezlerinden önce deyim girmiş gibi görünüyorlar. Hataları kapatmakla iyi mi yaptım bilemiyorum ama bunlar hata değil...

void main()
{
   Enum en;
   with (Enum)
   if (matchAny(en, en1, en2)) { }
}

alias'la ilgili son bir şey daha (http://d.puremagic.com/issues/show_bug.cgi?id=7609) öğrendim ama bunu başka başlıkta bahsetmeliyim... ;-)

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

« First   ‹ Prev
1 2