Forum: D Programlama Dili RSS
Tuple isim listesini almak
Avatar
zekeriyadurmus #1
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Tuple isim listesini almak
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
Bilgi meraktan gelir...
acehreli (Moderatör) #2
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 bu mesajını anlayamadım. :(

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
Avatar
zekeriyadurmus #3
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #4
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Biraz baktım da https://github.com/adamdruppe/misc-stuff-including-D-progr… buradaki kütüphanede zaten bu özellik varmış en iyisi kütüphane değiştirmek :)

Zekeriya
Bilgi meraktan gelir...
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ı
Yanıtlanan mesaj #3
zekeriyadurmus:
Bir ton yazdım bütün sayfa resetlendi

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

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.

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 mesaj acehreli tarafından değiştirildi; zaman: 2013-12-07, 13:29.
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ı
Ö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
Avatar
zekeriyadurmus #7
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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
Bilgi meraktan gelir...
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ı
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
Avatar
zekeriyadurmus #9
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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
Bilgi meraktan gelir...
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-21, 19:38:56 (UTC -08:00)