June 04, 2011

Güzel! :)

Denemek için yazdığını görüyorum ve sen de bazılarını değiştireceksin ama bir kaç tabii ki kişisel görüşüm var:

  • Ben özel bir nedeni yoksa float yerine double kullanıyorum. Tabii belki de en iyisi gerçekleştirme türünü ve hatta boyutu bile parametre olarak almaktır:
struct Vector(T, int boyut)
{
   T[boyut] elemanlar;
}
  • Yapılar değer türleri olduklarından dil bize çok yardımcı oluyor; bizim bazı durumlarda özel işlemler yapmamıza gerek kalmıyor. Örneğin bu tür için opAssign(Vector2)'yi yazmaya aslında gerek yok

  • Bu yüklemeler aslından birden fazla işleçle de kullanılabilir. Onun için şablon kısıtlamalarıyla küçük bir deney yaptım. std.algorithm.canFind, bir elemanın bir aralıkta bulunup bulunmadığını bildiriyor. Belki dışlama gereken durumlarda yararlı olabilir:

import std.algorithm;
// ...
   void birŞablon(/* ... */)
   if (!canFind("/%", işleç))
   {
       // ...
   }

Ali

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

June 04, 2011

Alıntı (erdem):

>

'float' sayılar için optimize edilmiştir türünden bir şeyler okumuştum

Yani "geçerli bir nedeni" varmış. ;)

Alıntı:

>

Alıntı (acehreli):

>
> > struct Vector(T, int boyut)
> > {
> >     T[boyut] elemanlar;
> > }
> > ```

> >
> Burda boyutun nasıl kullanılacağını anlamadım.

alias'ı hatırlamışsın zaten...

Benim yaptığım, uzunluğu 'boyut' olan bir sabit dizi kullanmaktı. Böylece bütün işleç yüklemelerin şu kadar basit olabilir:


elemanlar[] *= sağdaki;



Ayrı ayrı x ve y yazmaya gerek yok. O işlem bütün elemanlara uygulanır. (Aslında son baktığımda bu konuda hatalar vardı. (Hatırlatma: http://ddili.org/ders/d/dilimler.html sayfasındaki "Bütün elemanlar üzerindeki işlemler" (Kendim de hatırladım: sabit uzunluklu dizilerde zaten hata yokmuş.))

Alıntı:
> Alıntı (acehreli):
> > std.algorithm.canFind, bir elemanın bir aralıkta bulunup bulunmadığını bildiriyor.
> >
>
> Biraz açabilirmisiniz.

Şablon kısıtlamalarında tek tek 'işleç == "*"' yazmak zorunda kalmamak için canFind'ı düşündüm. canFind, aranan eleman aralıkta bulunduğunda true döndürüyor. Yani '!canFind("/%", işleç)' yazınca "işleç bölü veya yüzde karakteri değilse" anlamına geliyor. D'nin derleme zamanında işlev işletebilmesinin (CTFE) bir yararı daha. :) Yoksa şablon kısıtlamasında kullanamazdık.

Alıntı:
> Ama alias şablonlarla problem çıkarır mı bilmiyorum.

Hiçbir sorunu olmaz. alias, yazdığın türün ta kendisi yerine geçiyor. Yalnızca kullanışlı bir ad. (C'nin typeof'unun aynısı.)

Ali

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

Alıntı (acehreli):

>

alias, yazdığın türün ta kendisi yerine geçiyor. Yalnızca kullanışlı bir ad. (C'nin typeof'unun aynısı.)

Yanlış! alias, C'nin typedef'inin aynısıdır.

Ali

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

June 04, 2011

Üç küçük not:

   @property T uzaklık(ref const Vector v2) const
   {
       T yMesafesi = v2.y - y;
       T xMesafesi = v2.x - x;
       return sqrt(yMesafesi * yMesafesi + xMesafesi * xMesafesi);
   }

Benim anladığım kadarıyla, eğer parametre almıyorsa @property bu nesnenin bir niteliğini döndürür. Eğer parametre alıyorsa, atama işlemi ile bu nesnede bir değişiklik yapar. (Şuradaki "Atama işleci ile kullanılan nitelik işlevleri" başlığında bir örnek var: http://ddili.org/ders/d/nitelikler.html)

O yüzden bence uzaklık() @property olmasa daha uygun.

  1. tersiniBul() yerine tersi() daha iyi bir isme benziyor. Hatta işte bu bir @property olabilir galiba. Çünkü v.tersi deyince v'nin bir niteliğini veriyor. (Senin neden Bul ile bitirdiğini anlıyorum: işlevlerin isimlerinin emir kipinde olması uygun.)

  2. Aslında önceden olduğu gibi türün ismi Vector2 olmalı, çünkü iki noktası var. Yani "2'liğini" şu alias vermiyor:

alias Vector!(float) Vector2;

Ali

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

March 04, 2012

Herkes iyi haftalar dilerim...

Hafta sonuna bakarsak benim için çok karma karışık oldu! Bu işleç yükleme (operator overloading) olayı yeterince kafamı karıştırdı. Ancak kısmen yol aldığımı söyleyebilirim. Sormak istediğim tek bir şey var:

Acaba aşağıdaki örnekte görüldüğü üzere, yeni bir matematik formasyonu temeli oluştursak ama alıştığımız gibi; yani:

set += cast(int) 2; // cast'i değeri ifade etmek için kullandım lütfen cast olmadan düşünün...

Örneğinde olduğu gibi kullanabilsek mümkün mü?
Alıntı:

>
> import std.stdio;
>
> template Signs(string sign, T) {
>     void Assign(ref T a, T b) {
>         static if (sign == "+") a += b;
>           else if (sign == "-") a -= b;
>           else if (sign == "*") a *= b;
>           else if (sign == "/") a /= b;
>     }
> }
>
> struct newMath {
>     int x;
>
>     ref opOpAssign(string sign)(newMath value) {
>         Signs!(sign, typeof(x)).Assign(x, value.x);
>     }
> }
>
> void main() {
>     auto set = newMath(1);
>     for (int pic = 1; pic < 7; pic++) {
>         set *= newMath(pic);
>         writeln(set.x);
>     }
> }
> ```

>
Sevgiler, saygılar..

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

Ay çok teşekkür ederim, o dersi işlememişim! Katmalar'dan sonra hangi derse devam etmeliyim?

Aşağıda mart başı itibariyle takip listem var. Sizce bu ay bu da olmazsa olmaz, mutlaka işle diyebileceğiniz bir başlık...

http://desmond.imageshack.us/Himg338/scaled.php?server=338&filename=dmart1derstakip.png&res=crop (http://imageshack.us/photo/my-images/338/dmart1derstakip.png/)
Uploaded with ImageShack.us (http://imageshack.us)

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

March 05, 2012

Merhaba Ali Hocam,

Listeyi siteye yüklerken ve sende özellikle belirtince Yaşam Süreçleri ve Temel İşlemler (http://ddili.org/ders/d/yasam_surecleri.html) de ilgimi çekti. Dediğin gibi sırayla gitmek gerekiyor ama herkesin seviyesi doğal olarak aynı değil. Peki şöyle bir şey önerebilir miyim:

Derslerin listesine girince, atıyorum 1-3 arası bir seviye sorulur veya birden fazla bağlantı konursa harika olur. Böylece seviyeye göre farklı sıralamalı dersler ekrana getirilebilir. Hatta bir de "popularity list" bağlantısı da eklenirse hem öğretmen, hem de öğrenciler için faydalı olacağını düşünüyorum. Örneğin her ders maddesinin yanında parantez içinde ne kadar gözde (hit) olduğu sayısı verilebilir. Bu listede büyükten küçüğe göre sıralanır. Bu önerilerin hayata geçirilmesinde bir yardımım dokunursa söylemeniz yeterli. Hemen hangi script müsaitse CGI bölümünü yazayım inşaallah.

Başarılar...

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

March 05, 2012

D bazı konularda fazla güçlü. :) newMath sınıfına şu işleci eklediğimizde:

   ref opOpAssign(string sign)(int i) {
       mixin("x " ~ sign ~ "= i;");
       return this;
   }

şöyle deneyebiliyoruz:

   set += 2;
   writeln(set.x);

   set -= 3;
   writeln(set.x);

   set /= 4;
   writeln(set.x);

   set %= 5;
   writeln(set.x);

   // vs.

Hatırlatmak için, şuradaki "Dizgi katmaları"ndan yararlanıyor:

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

Ali

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

March 05, 2012

Alıntı (acehreli):

>

Hatırlatmak için, şuradaki "Dizgi katmaları"ndan yararlanıyor:

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

Şimdi baktım; orada "İşleç yüklemedeki kullanımı" diye bir başlık da varmış. :)

Ali

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

March 05, 2012

Alıntı (Salih Dinçer):

>

Katmalar'dan sonra hangi derse devam etmeliyim?

Ben bölümleri birbirini takip edecek biçimde düşündüm. Bence baştan devam edilmeli ama öyle de sıkıcı oluyor tabii. Örneğin aralıklar önceki bir çok olanağı kullandıkları için bayağı sondalar ama kolayca da kullanılabiliyorlar. Yani daha önçe de olabilirlermiş.

O listede mavi olanlar okumadıklarınsa, şunlar daha önemli:

  • Hata Atma ...

  • Birim Testleri

  • Yaşam Süreçleri ...

  • İşlev Yükleme

  • Object

  • İşlev Göstergeleri ...

  • vs. :)

Ali

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