April 22, 2013

Alıntı (acehreli):

>

'module' ile verilen isim dosyanın isminden farklı olursa karışıklık olabiliyor.
Hocam sanırım main.d'den bahsediyorsun? Çünkü alt modüllerde farklı dosya ismi olunca "conflicts" hatası alıyoruz.

Alıntı (acehreli):

>

'private'ı ya karıştırmışsın ya da yanlış anaşılabiliyor. D'nin 'private'ı örneğin C++'ınki gibi değil. 'private', "sınıfa özel" demek değil. Modüle özel demek
Sanırım karıştırıyor olabilirim, ben bu ikisi üzerinde biraz daha deneme yapayım...:)

Alıntı (acehreli):

>

Ek olarak, bu gibi isimlerde takı kullanmamak daha kullanışlı değil mi?
Bu takıları bilinçli olarak, insancıl olsun diye yaptım. Ancak geniş bir projede bu alışkanlık iyi değil.

Alıntı (acehreli):

>

O örneği tam anlamadım ama belki yukarıda yazdıklarımla ilgilidir. (?)
Belki ilgili olabilir ama birebir örneği denediğimizde sanki private yazılmamış gibi kod derleniyor. Sanırım enum'ların gerçekte bir değişken değil makro gibi çalışmalarından olsa gerek. Yani bir enum derlenirken nerelerde geçiyorsa oralara birebir karşılığı yerleştiriliyor.

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

April 22, 2013

Çok güzel. :) Notlar:

  1. 'module' ile verilen isim dosyanın isminden farklı olursa karışıklık olabiliyor.

  2. 'private'ı ya karıştırmışsın ya da yanlış anaşılabiliyor. D'nin 'private'ı örneğin C++'ınki gibi değil. 'private', "sınıfa özel" demek değil. Modüle özel demek. Bir sınıfın içindeki 'private' üyeye o sınıfın modülündeki her kod erişebilir. Bunu, sınıfı yazan modülü de yazmıştır mantığı ile böyle tasarlamışlar. Kişinin kendisini kendisinden korumaya gerek yok gibi düşünmüşler. C++ gibi başka dillerden gelenlerin bazıları D'nin bu seçimini yadırgarlar.

  3. Ek olarak, bu gibi isimlerde takı kullanmamak daha kullanışlı değil mi? Örneğin, ev kavramını temsil eden bir modülün ismi 'ev', dosyasının ismi de 'ev.d' olmalı. 'evim.d' gibi olunca yalnızca benim evimi temsil etmiş gibi anlaşılmaz mı? Yoksa, içinde evler bulunan bir köy olduğunda üyesini 'Evim[] evler;' diye tanımlamak gerekir ve sanki içinde benim evimden bir çok kopya varmış gibi görünür. Öte yandan, eğer 'evim.d'nin içindeki türün ismi zaten 'Ev' ise neden dosyasının ismi 'evim.d' olsun diye de düşünülebilir.

Alıntı:

>

private ile protected arasında henüz bir fark göremiyorum.

private: Bu üyeye yalnızca bu modül erişebilir

protected: Bu üyeye bu paketteki başka modüller de erişebilir

Alıntı:

>

Şu örnekte neden public gibi davranır?

O örneği tam anlamadım ama belki yukarıda yazdıklarımla ilgilidir. (?)

Ali

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

April 22, 2013

Alıntı (Salih Dinçer):

>

Hocam sanırım main.d'den bahsediyorsun? Çünkü alt modüllerde farklı dosya ismi olunca "conflicts" hatası alıyoruz.

O yüzden denemelerim.d modülüne DENEMELER dememek gerek. Ama haklısın: kimse main'in bulunduğu modülü import etmez. :)

Alıntı:

>

Sanırım enum'ların gerçekte bir değişken değil makro gibi çalışmalarından olsa gerek. Yani bir enum derlenirken nerelerde geçiyorsa oralara birebir karşılığı yerleştiriliyor.

Anladım. Evet, private'a uymalı gibi geliyor... Öte yandan, öyle enum hazır değerler değiştirilemediklerine göre 'private' olmaları da diğer değişkenler kadar önemli değil. Bence yine de uymalı.

Tarih öncesinden (2005) aşağıdaki gibi bir tartışma buldum. Anlaşılan, senin de tahmin ettiğin gibi bu bir hata değilmiş çünkü erişim belirteçleri bildirimleri (declaration'ları) etkiliyormuş. Oysa enum'lar tanımmış (definition).

http://forum.dlang.org/thread/cue3ro$d5i$1@digitaldaemon.com

Ali

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

April 24, 2013

Denemelerimi sürdürüyorum...

Yaşam süreçleri konusunda aşağıdaki gibi bir deneme yaptım. Ne olup bittiğini anlamak için, mutfak tarafına geçip assembly kodlarına da baktım. Çok uzatmayacağım çünkü ummadığım bir sonuç çıktı, tüm hayallerim yıkıldı...:)

Evet, hemen altındaki gibi bir sonuç elde edemiyorsunuz; anlaşılan, seçeneklerin her biri güzel parantezler gibi ayrı bir kapsam...

//import core.stdc.stdio;/*
import std.stdio;//*/

 class A {
   override
   string toString() const {
     return "A SINIFI";
   }
 }

 class B {
   override
   string toString() const {
     return "B SINIFI";
   }
 }

void main(string[] arg) {
 A bir;
 B iki;

 char seçenekler = arg.length > 1 ? arg[1][0] : 0;

 switch(seçenekler) {
   case 0:
     printf("PARAMETRE KULLANILMALI\n"); break;
   case 1:
     bir = new A(); goto default;
   case 3:
     bir = new A();
   case 2:
     iki = new B();
   default:
     if(bir) bir.writeln;
     if(iki) iki.writeln;
 }
} /* BEKLENEN:

/önSeçimliSınıflar
PARAMETRE KULLANILMALI

/önSeçimliSınıflar 1
A SINIFI

/önSeçimliSınıflar 2
B SINIFI

/önSeçimliSınıflar 3
A SINIFI
B SINIFI
*/

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

April 24, 2013

Çok ilginç!

Sınıflar, switch case ifadesi için hiç kurulamıyor. Aslında kuruluyor olmalı, çünkü assembly kodlarında kurucu alt yordama dallanıyor ama aşağıdaki gibi düzenleme yaptığımda kurulmadığı sonucunu çıkarıyorum!

 class A {
   this() { "A SINIFI".writeln; }
 }

 class B {
   this() { "B SINIFI".writeln; }
 }

Sanki derleyici, hangi parametrenin geleceğini tahmin edemediği için bellekte onun için bir yer ayırmıyor ya da kurucu üye olan this()'i çalıştırmıyor olmalı çünkü ekrana bir şey yazmamayı tercih ediyor...:)

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

April 24, 2013

Şimdi oldu ama if() ile...:)

Sanırım öncesinde bir hata var ama tespit edemedim. Aslında kapsam dışı kalan bir şey yoktu. Çünkü uygulamanın başında 2 nesne A ve B türünde ama null olarak kuruluyordu. Sonuçta seçime göre bunlar bir değer almalıydı. Şu şekilde bir sıkıntı yok ve beklenen sonuçları ekranda alabiliyorum. Ama neden switch case ile olmuyor?

void main(string[] arg) {
 A bir;
 B iki;

 char seçenekler = arg.length > 1 ? arg[1][0] : 0;

 if(seçenekler == '1') bir = new A();
 else if(seçenekler == '2') iki = new B();
 else if(seçenekler == '3') {
   bir = new A();
   iki = new B();
 } else printf("PARAMETRE KULLANILMALI\n");
}

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

April 24, 2013

Evet Ali hocam, 2.062 sürümünde denedim ve çok şaşırdım...:)

Yani dili, 1 seneden fazladır öğrenmeye çalışırken, hatta 20 yıldır program yazdığımı düşünürken hala switch case'i tam olarak bilmediğimi ve/veya D diline özel gelişmeler kaydedildiğini görüyorum ya 1 yaşıma daha girdim diyesim geliyor...

'( Aslında bu ay başında 7 nisanda bir yaşıma daha girmiştim. Artık yaşım trafik koduna göre İstanbul oldu...:D )'

Gerçi OOP konusunda cahilim, hatta hayatımın büyük kısmı boyunca uzak kaldım diyebilirim. Bütün bunların D sayesinde olduğunu da itiraf etmeliyim; ve elbette senin sayende, teşekkür ederim...

Konumuza dönersek:

D.ershane'ye baktığımda "case değerleri derleme zamanında bilinmelidir" başlığı ile biraz üstündeki şu not konumuzla ilgili olabilir mi?

Alıntı:

>

Not: Yukarıdaki kod hiçbir case'e uymayan durumda bir hata atmaktadır. Hataları ilerideki bir derste göreceğiz.

Belki bu konuyu switch case ile ilgili şu başlıkta tartışabiliriz: http://ddili.org/forum/thread/1062

Çünkü gerçekten case: kümelerinde garip bir şeyler dönüyor gibi...:)

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

April 24, 2013

Alıntı (Salih Dinçer):

>

assembly kodlarına da baktım

Orada bir fark göremeyiz çünkü erişim hakları derleme zamanında denetlenir. (const, immutable, shared, vs. de öyle.)

(Not: Pardon, o konuyu geçmişiz. ;) )

Alıntı:

>
>     case 3:
>       bir = new A();
>     case 2:
>       iki = new B();
> ```


Hangi derleyiciyi kullanıyorsun? Ne yapmak istediğini goto kullanarak belirtmen şart. Bu kural sonradan değişmişti. (En azından 2.062'de öyle.) Şu bölümü değiştirmişim bile:

 http://ddili.org/ders/d/switch_case.html

Ali

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

Aslında switch deyimi üstü örtülü bir grup goto deyiminden başka bir şey değildir. Koşula uyan case'e goto ile gidilmesi gibidir. Zaten C ve C++'ta (ve bir kaç sürüm önceki D'de) bundan başka bir şey de değildir. C ve C++'ta gidilen case'in altındaki kodlar işletilir, bir break ile karşılaşılmamışsa da bir sonraki case'in altına devam edilir. Aynı goto gibi...

Ne yazık ki hatalara açık bir durumdur çünkü bazen devam edilmesi istenmediği halde break deyimi unutulduğu için devam edilir. Güvenliğe önem veren D bu durumu değiştirdi ve ne istediğini programcının açıkça belirtmesini şart koşmaya başladı.

Sanırım hiç kimsenin itiraz etmediği olumlu bir değişiklik oldu...

Ali

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

1 2
Next ›   Last »