Forum: D Programlama Dili RSS
duck! veya adaptTo! veya as! veya başka bir isim
acehreli (Moderatör) #1
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ı
Konu adı: duck! veya adaptTo! veya as! veya başka bir isim
Şu sıralarda ilginç bir olanak tartışılıyor.

D'nin güçlü olanakları, Python'da da çok sözü geçen "duck typing"in D'de de bir kütüphane olanağı olarak desteklenmesini sağlıyor.

Bilmeyenler için: "duck typing", dinamik dillerin "eğer ördek gibi yürüyorsa ve ördek gibi vakvaklıyorsa ördektir" anlayışından geliyor. D, normalde öyle bir dil değildir: belirli bir kullanımı desteklese de, her tür her yerde kullanılamaz.

Örneğin SesliAlet diye bir arayüz bekleyen bir işlev, ancak o arayüzden türemiş olan türlerle çalışır. Bu konuya şu sayfada değinmiştim:

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

Orada "Derleme zamanı çok şekilliliği" başlığına bakarsanız, şablonların da aslında "ördek türü"nü desteklediğini ama bunu derleme zamanında yaptığını görürsünüz.

İşte, bu yeni D kütüphane olanağı adaptTo! ismiyle şurada:

  http://github.com/9rnsr/scrap/blob/master/interfaces/inter…

Yazarı olanağı şurada özetliyor:

  http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

İşin garip tarafı; büyük tartışma, o olanağa ne isim verileceği üzerine dönüyor. :) Andrei ve Walter, pazarlama açısından duck! isminin yararlı olacağını söylüyorlar; bazıları buna karşı çıkıyor ve başka isimler öneriyorlar.

İlginç bir gelişme olduğu için yazdım ama ben adaptTo! ile daha hiç ilgilenmedim bile. :(

Ali
canalpay (Moderatör) #2
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
D forumlarında gördüğümde ağzımdan çıkan söz "İmdat benim fikrimi çalmışlar :-p "


Bende aynısını düşünmüştüm. Hatta ben nasıl bir mantık ile yapabileceğimi bilmediğim için aklımdan iki olanak geçiyordu. En basiti asıl olarak temel türler için çalışacak bir struct idi. Gelen verinin ne türü olduğunu şablon özellemesi ile bulacak ve o türde sahttp://ddili.org/forum/thread/394klayacaktım. auto gibi. Ama python gibi dinamik dillerdeki gibi bir daha değişebilecekti.

Yani şu çalışacaktı:

Genel a= "a";
a=5;

Ancak ben çok ilerleyemedim ve benden önce davranmışlar :-)

Duck ismi en iyisi aslında. Yazımı da kolay.
acehreli (Moderatör) #3
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ı
Gösterdiğine benzeyen iki olanak var: std.variant ve std.boxer. (Aynı kavram C++ için de Boost'ta boost::any olarak bulunur.)

duck'ın o ikisinin üstüne ne getirdiğine ben daha bakmadım.

Ali
canalpay (Moderatör) #4
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Öylesine bir baktım ve aradığımı bulduğumu düşünüyorum.

İlk önce std.boxer yerine std.variant'ı uyguluyor.

import std.variant;
import std.stdio;
int main()
{
    Variant a;
    writeln(typeid(a));
    a=55;
    writeln(typeof(a).stringof);
    a="yazı";
    writeln(a.type); /// Sadece gerçek türü bunun ile veriyor.
    a=1.56;
    return 0;
}
acehreli (Moderatör) #5
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ı
Çok güzel. Ve a.type içindeki gerçek türe göre de çalışma zamanında değişiyor. D beni şaşırtmaya devam ediyor. :)

Aslında Variant gibi olanaklar gerçekte çok kullanılmıyor.

Buna rağmen, bizim bir C kütüphanemizin en can alıcı bölümünde bile aslında bu kavramın bulunduğunu söylemeliyim. :) En alt düzeyde, farklı türden değerlerin barındığı bir ağacımız var. Bu ağacın düğümlerinin değerleri belirli bazı türlerden herhangi birisi olabiliyor. Tabii düğümün kullanıldığı yerde türünün tam olarak bilinmesi ve o şekilde kullanılması şart.

Örneğin bir düğüm cihazın içindeki bir ısının değeri olabiliyor. Kullanan taraf, o değerin 'double' türünden olduğunu biliyor ve kullanırken ona dönüştürülmesini istiyor. Sözde kod olarak:

/* C kodu */
double sicaklik = 0;
hata = dugum_degeri_double_olarak(dugum, &sicaklik);
if (hata) goto son;
 
/* ... burada sicaklik degerini kullan ... */

Aynı şey Variant'ta da var; kullandığımız noktada hangi türden değer barındırdığını bilmemiz gerekiyor:

    /* Sonunda değerini kullanmak istediğimizde */
    double değeri = a.get!double;

O çalışıyor ama şu hata atıyor; çünkü içindeki değer int değil:

    int int_olarak_değeri = a.get!int;   // <-- Bu hata atıyor 

Ama Variant.toString var; onunla her türü string'e dönüştürebiliriz:

import std.conv;
/* ... */
    writeln(to!string(a));

Zaten sanırım o yöntem "serialization" kütüphanelerinde kullanılıyor. Variant'ın türü ve değeri dizgi olarak saklanır, sonra asıl türüne dönüştürülebilir.

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:
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, 05:52:25 (UTC -08:00)