Forum: Ders Arası RSS
Aritmetik işlevler özelleştirilebilir mi?
+=, -=, *=, /= vb.
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Aritmetik işlevler özelleştirilebilir mi?
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) 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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 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.9*10, 0.9*20) = (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.
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.

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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-19, 00:40:11 (UTC -08:00)