Thread overview
duck! veya adaptTo! veya as! veya başka bir isim
October 18, 2010

Ş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/interfaces.d

Yazarı olanağı şurada özetliyor:

http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=119691

İş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

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

October 20, 2010

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.

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

October 20, 2010

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

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

October 24, 2010

Ö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;
}

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

October 24, 2010

Ç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

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