Thread overview
Aritmetik işlevler özelleştirilebilir mi?
Feb 22, 2012
Salih Dinçer
Feb 22, 2012
erdem
Feb 23, 2012
Salih Dinçer
Feb 23, 2012
erdem
Feb 23, 2012
Salih Dinçer
Feb 23, 2012
Salih Dinçer
February 23, 2012

Merhaba,

Özelleştirmekten kastım, örneğin kendi uygulamam için dört işlemi özelleştirdiğim 4 işlevim (function) var. Bunları ayrı bir veri türü üzerinden kullandığımda işlevlerime göre işlem yapsın. Mesela şöyle dediğimde;

'if() is (T: Complex) => m *= a + b;'

Çarpma ve toplama işleçlerini (operator), işlevimdeki komutlara göre yorumlayıp bana sonucu döndürsün. Tamam, istersem @property gibi tanımlanarak da basit şeyler yapılabilir. Ama işleçler üzerinden akıllıca bunu D dili ile yapabiliyor muyuz?

Dip Not: Sorunun cevabını almak için BigInt sınıfını inceledim (-bknz. satır 194 (https://github.com/D-Programming-Language/phobos/blob/master/std/bigint.d#L194)) ama verileri dizge (string) şeklinde işliyormuş:

// BigInt op= BigInt (satır 194)
   BigInt opOpAssign(string op, T)(T y)
       if ((op=="+" || op== "-" || op=="*" || op=="/" || op=="%")
           && is (T: BigInt))
: : :

Teşekkürler...

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

February 23, 2012

Evet böylelikle işleçlerin bizim istediğimiz şekilde çalışmasını sağlayabiliriz.

struct Vector(T)
{
   T x, y;

   this(T x, T y)
   {
       this.x = x;
       this.y = y;
   }

   /* ... */

   // vector2 *= sayı
   ref Vector opOpAssign(string işleç)(T sağdaki)
   if (işleç == "*") {
       x *= sağdaki;
       y *= sağdaki;
       return this;
   }

   /* ... */
}

Bunu bir vektör sınıfı yazarken kullanmıştım.

https://github.com/erdemoncel/oyun/blob/master/src/vector2.d

Dershanede de bu konuyla ilgili bir ders var:

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

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

February 23, 2012

Merhaba Erdem,

Kastettiğim tam olarak böyle değil; misal, şöyle dediğimde:

araTop /= elde + a + b;

Aslında bir işlev (function) içindeki şu kodu işletebilir miyim?

toplam = (a + b) % 10;
eldesi = elde / 10;
araTop = eldesi + toplam;

Yoksa struct içinde yapılan atama için:

tamTopla.opOpAssign!"+"(a+b, elde);

Demek yerine sanırım "elde.tamTopla(a+b);" diyebilirdim. Amacım kısaltmak veya uzaltmaktan çok alıştığımız dört işlemi biraz daha ileri taşıyarak (ama benzer anlamlar yükleyerek) karmaşık bir işlem yapmak. Her ne kadar basit işlevler ile bunu yapabilsek de kodun tamamına hakim olan bir uygulamada (örn. complex numbers) kodlayana kolaylık olacağı aşikar.

Teşekkürler...

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

February 23, 2012

Tam olarak ne yapmak istediğini anlamadım :rolleyes:

Karmaşık sayılar, vektörler için işleç yüklemeyi kullanabilirsin. Aslında D için karmaşık sayı sınıfı yazmaya gerek yok çünkü zaten std.complex (http://bit.ly/Axw768) sınıfı var.

Ama vektör ya da yöneyler için bu özellik çok kullanışlı. Örneğin oyuncumuzun hızı (10, 20) olsun. Oyuncu hareket ederken oyuna daha gerçeklik katmak için oyuncunun hızına karşı gösterilen hava direncini hesaplayabiliriz. Bunu da oyuncunun hızını her karede 0.9 ile çarparak buluruz.

0.9*(10,20) = (0.910, 0.920) = (9,18)

Ama derleyici biz kendimiz yöneyin çarpma işlevini kendimiz yazmazsak hata verecektir. Çünkü derleyiciye göre elma ile armudu çarpmış gibi oluyoruz.

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

February 23, 2012

Aslında tam olarak yapmak istediğimiz henüz açıklamadım. Verdiğim misal aklıma gelen ilk örnekti. Karmaşık sayıları (complex) kastetmiyorum. Sadece işleçlerin bu tür kullanımlarını ilk Mandelbrot Fractal uygulamasında karmaşık sayıları hesaplarken görmüştüm. Tabi dil C#'dı ve aynısını D'de olup olmadığını merak ettim.

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

February 23, 2012

Aslında /= işleçini kullanmak istiyordum. Hatırladığım kadarıyla D.ershane'de kasirsiz bölüm ve elde değerlerini döndüren bir işlev (method) örnek gösterilmişti. Benim yapmak istediğim; bunun daha karmaşığı ama işleç üzerinde...

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

February 23, 2012

Ben de işleç yükleme (operator overloading) olarak anlıyorum. + gibi bir işlecin kendi türümüze uygun olarak davranmasını istiyorsun değil mi? (Ama verdiğin örnekteki hesaplara karışan %10 çok yanıltıcı olur. Toplama kavramı o tür için toplama ne ise o işlemi gerçekleştirmeli.)

Eğer doğru anlıyorsak Erdem'in gösterdiği bölüm herşeyi anlatıyor. Orada da göreceğin gibi tanımlanan işlevin ismi örneğin opOpAssign olsa da hiçbir zaman şöyle yazılmaz:

tamTopla.opOpAssign!"+"(/* ... */);

Belki de expression templates denen kavramdan bahsediyorsundur. Tabii ki o da mümkün.

Ali

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

February 23, 2012

Alıntı (Salih Dinçer):

>

Aslında /= işleçini kullanmak istiyordum.

  • işlecini öylesine bir örnek olarak söylüyoruz. Bir kaç tanesi dışında her işleci tanımlayabilirsin. /= özel olarak tanımlanabilir.

Alıntı:

>

Hatırladığım kadarıyla D.ershane'de kasirsiz bölüm ve elde değerlerini döndüren bir işlev (method) örnek gösterilmişti. Benim yapmak istediğim; bunun daha karmaşığı ama işleç üzerinde...

Google'da "site:ddili.org payda" diye aratınca şu dersi buluyorum:

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

Ama orada işleç yüklemeye hiç değinmemişim. Bence Erdem'in gösterdiği bölümü okumak gerek.

Ali

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