Thread overview
December 06, 2013

Yine ilginç bir ihtiyacım oldu araştırdım bulamadım kodları biraz inceleyip gerekli yeri çıkarttım ve tuple daki isimleri alabiliyorum.

import std.stdio;
import std.typecons;
import std.typetuple;

int main(string[] argv){
	alias t1 = Tuple!(int, double);
	foreach (i, name; staticMap!(t1.extractName, t1.fieldSpecs)){
		writefln("%s => \"%s\"",i, name);
	}
	alias t2 = Tuple!(int, "s1", double, "s2");
	foreach (i, name; staticMap!(t2.extractName, t2.fieldSpecs)){
		writefln("%s => \"%s\"",i, name);
	}

   return 0;
}

Neden böyle bir şey yapma gereği duyduğuma gelirsek mysql fonksiyonununun yapısını biraz güçlendirmeyi hedefliyorum.

Mesela

alias Tuple!(int, "id", string, "username", string,"password") userTuple;
foreach(row; db.query!userTuple("Select id, username, password")){
   writefln("#id: %s , us: %s, pw: %s",row.id, row.username, row.password);
}

Hali hazırdaki mysql kütüphanesinde gördüğüm kadarıyla böyle bir özellik yok. Bunu typetuple ile yapmayı planlıyorum.

Zekeriya

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

December 07, 2013

Bir ton yazdım bütün sayfa resetlendi durup dururken :s Tekrar yazmak zorunda kalıyorum :)

Hocam d nin son sürümü mü yüklü? ve ayrıca kütüphaneleri dahil ettiniz mi?

auto çokuzlu = Tuple!(int, "s1", double, "s2")(1,2);
writeln(çokuzlu.s1); //1
writeln(çokuzlu.s2); //2

Bu şekilde s1 ve s2 ye erişerek değerleri ekrana yazdırabiliyoruz. Benim istediğim şey bu değerlere erişmek. Yani çokuzlumuzun içerisinde hangi isim değerleri var ("s1", "s2")

Nedenine gelince hali hazırdaki mysql kütüphanemizde indeks numarasına göre erişiyoruz veriye ama onun yerine direk isim ile erişmek istiyorum.

Şimdi bir ihtiyacımda bu isimleri değiştirmek oldu s1 yerine s3 yapmak daha doğrusu hiç tanımlanmamış isimleri yeniden oluşturmak lakin compile time olduğu için bunun mümkün olduğunu hiç sanmıyorum.

Yapmak istediğim şey şu aslında

foreach(row; db.query!(int, string, string)("Select id, username, password")){
   writefln("#id: %s , us: %s, pw: %s",row.id, row.username, row.password);
}

Sadece sorgudan dönecek olan verilerin türlerini yazacağım bu şekilde ve onlara direk isimleriyle erişeceğim. Ve ayrıca sistemi Variant tan kurtaracağım. daha rahat işlemler yapabileceğim bu sayede.

Şimdi biraz bakınca hayal gibi duruyor ama denemeye değer eğer bu veritabanı işlemlerini kolaylaştırabilirsem daha rahat işlemler yapabilirim :)

Zekeriya

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

December 06, 2013

Ben bu mesajını anlayamadım. :(

Alıntı (zekeriyadurmus):

>

tuple daki isimleri alabiliyorum.

Yani yerel değişiklikler yaptın da öyle mi başarılı oldun? Gösterdiğin kod bende derlenemiyor:

'deneme.d(154350): Error: no property 'extractName' for tuple '(int, double)''

writefln satırlarında ne yazıldığını (veya ne yazılması istediğini) anlayamıyorum ama belki tupleof ile (de) başarılabilir:

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

Ali

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

December 07, 2013

Biraz baktım da https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff/blob/master/mysql.d buradaki kütüphanede zaten bu özellik varmış en iyisi kütüphane değiştirmek :)

Zekeriya

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

December 07, 2013

Alıntı (zekeriyadurmus):

>

Bir ton yazdım bütün sayfa resetlendi

:( Ben her şeyi Emacs'te yazıyorum sonra nereye gidecekse oraya kopyalıyorum.

Alıntı:

>

Hocam d nin son sürümü mü yüklü? ve ayrıca kütüphaneleri dahil ettiniz mi?

Evet, GitHub'daki son durumuyla denemiştim: v2.065-devel-41ebb59.

Alıntı:

>

Yani çokuzlumuzun içerisinde hangi isim değerleri var ("s1", "s2")

Tuple'ın şu andaki gerçekleştirmesine dayandığı için kırılgan olan bir çözüm buldum. Hiç olmazsa Tuple değiştiğinde birim testi hata verir:

import std.stdio;
import std.typecons;
import std.array;
import std.algorithm;
import std.ascii;

bool altÇizgiVeRakamlar_mı(string s)
{
   if (s.length >= 2) {
       if (s.front == '_') {
           s.popFront();
           return s.all!(a => a.isDigit);
       }
   }

   return false;
}

unittest
{
   auto değiller = [ "abc", "a01", "_abc", "_12x", ];
   auto öyleler = [ "_0", "_3456", "_0060" ];

   import std.algorithm;
   assert(!değiller.any!altÇizgiVeRakamlar_mı);
   assert( öyleler.all!altÇizgiVeRakamlar_mı);
}

/**
* __traits(allMembers)'ın std.typecons.Tuple için döndürdüğü değere bakar ve
* isimli üyelerden oluşan dilim döndürür.
*
* Doğru çalışması, yaptığı iki varsayıma dayanır:
*
* 1) İsimli veya isimsiz, Tuple türünün her zaman var olan üyelerini bilir
* 2) Tuple üyelerinden bazıları alt çizgiden ve rakamlardan oluşmaktadır
*/
string[] TupleÜyeİsimleri(T)()
   if (is (T == Tuple!(Specs), Specs...))
{
   string[] isimler;
// --------------- EK: Bu kod hatalı -----------
   const asılTupleÜyeleri =
       [ "Types", "expand", "_Tuple_super", "field", "__ctor",
         "opEquals", "opCmp", "opAssign", "slice", "toString",
         "_expand_field_0", "_expand_field_1" ];

   const bütünÜyeler = __traits(allMembers, T);

   foreach (i, isim; bütünÜyeler) {
       static if (!asılTupleÜyeleri.canFind(isim) &&
                  !altÇizgiVeRakamlar_mı(isim)) {
           isimler ~= isim;
       }
   }

   return isimler;
}

unittest
{
   assert(TupleÜyeİsimleri!(Tuple!(int, "a", double, "b")) == [ "a", "b" ]);
   assert(TupleÜyeİsimleri!(Tuple!(double, char)) == []);
}

void main()
{
   alias Ç = Tuple!(int, "s1", double, "s2");
   writeln(TupleÜyeİsimleri!Ç);    // [ "s1", "s2" ]
}

Ali

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

December 07, 2013

Önceki kod hatalıymış.

Aklıma, listeyi de otomatik olarak oluşturmak geldi. "_Tuple_super" ancak isimli üyesi olan Tuple'larda ortaya çıkıyormuş ve "expand_field" ile başlayanları da elemek gerekiyor:

string[] TupleÜyeİsimleri(T)()
   if (is (T == Tuple!(Specs), Specs...))
{
   string[] isimler;

   const asılTupleÜyeleri = [ __traits(allMembers, Tuple!()), "_Tuple_super" ];
   const bütünÜyeler = __traits(allMembers, T);

   foreach (i, isim; bütünÜyeler) {
       static if (!asılTupleÜyeleri.canFind(isim) &&
                  !altÇizgiVeRakamlar_mı(isim) &&
                  !isim.startsWith("_expand_field_")) {
           isimler ~= isim;
       }
   }

   return isimler;
}

Ali

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

December 08, 2013

Pek sağlıklı gözükmüyor bu yöntem ama getmembers ile erişmek hoşuma gitti hiç aklıma gelmedi bunu yapmak :). Benim kullandığım sürüm "D 2.064.2"

Bu olaya gerek kalmadı ama güzel bir tecrübe oldu. Arsd deki kütüphane gerçekten çok iyi.

Zekeriya

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

December 08, 2013

Hashmap olarak geri döndürüyor arsd de. row.column şeklinde erişilemiyor ama row["column"] olarak veya row[0] şeklinde erişim mümkün. Aynı zamanda object metodu da var onda .column olarak erişmek mümkün ama asp (klasik) de recordset olayının benzerini yapmışlar anladığım kadarıyla .column ile erişip değeri değiştirilebiliyor.

Benim için burada kodda tek fark hashmap üzerinden erişmek oldu. Bu da gayet iş görüyor ve ana kütüphanede değişiklik yapmamak iyi oldu :)

Zekeriya

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

December 08, 2013

Alıntı (zekeriyadurmus):

>

Bu olaya gerek kalmadı ama güzel bir tecrübe oldu. Arsd deki kütüphane gerçekten çok iyi.

Orada tam bu işi mi yapıyorlar, yoksa zaten buna gerek mi kalmadı? Senin burada ilk istediğini nasıl hallettiklerini merak ettim.

Ali

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