Forum: D Programlama Dili RSS
Kütükde takma isim ile yapılan değişiklikleri kaydetmek
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 940 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Kütükde takma isim ile yapılan değişiklikleri kaydetmek
Hatırlarsanız gtkd dersleri hazırlıyordum. Ama bu gün denediğimde baktım ki 64 bit üzerinde kütüphanenin 3.5.1 sürümü derlenmiyor.

Eski kütüklerde yerelleştirme çalışması yapmıştım. Örneğin eski kütüğümüz:

class Birseyler
{
 
    public string getLabel()
    {
    }
 
    alias etiketÖğren = getLabel;
 
    public void setLabel()
    {
    }
 
    alias etiketBelirle = setLabel;
 
    gulong addOnClicked()
    {
    }
    alias tıklandığında = addOnClicked;
 
    protected void internalRemoveOnReleased(OnReleasedDelegateWrapper source)
    {
    }
}
 
alias Düğme = Button;

Bu kütüphane güncellendikten sonra değişmiş. Örnek olsun diye yazıyorum:

class BirseylerYeniSurum
{
 
    public string getLabel()
    {
    }
 
    public void setLabel()
    {
    }
 
    gulong addOnClicked()
    {
    }
 
    protected void internalRemoveOnReleased(OnReleasedDelegateWrapper source)
    {
    }
 
    // yeni işlevler eklenmiş
 
 
    extern(C) static void callBackReleasedDestroy(OnReleasedDelegateWrapper wrapper, GClosure* closure)
    {
 
    }
}

Şimdi eski kütükte bulunan alias tanımlamalarını yeni kütüğe nasıl aktarabiliriz bir fikri olan var mı acaba.

Örneğin alias etiketBelirle = setLabel; için düşünürsek hem bu bilgiyi hem de kendisinden önceki işlevin ismini  ve dönüş türünü kaydedersek void setLabel() sizce yeterli olur mu.

Buradaki en sondaki takma isim de hiç işlevlerle bağlantısı yok sadece kütük ismi için bir takma isim.
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 940 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şimdilik şu şekilde aldım.  ;-)
import std.stdio;
import std.string;
import std.algorithm;
 
struct Yerel
{
    string kayıt;
    string bağlandığıYer;
}
 
void main()
{
    Yerel[] yereller;
 
    File dosya = File("eski/Button.d", "r");
 
    string[] öncekiSatırlar;
 
    while (!dosya.eof())
    {
        string satır = strip(dosya.readln());
 
        if (canFind(satır, "alias"))
        {
            // writeln(satır);
            // writeln("Önceki satırlar :");
            for (auto i = öncekiSatırlar.length - 1; i!= 0; --i)
            {
                auto seçiliSatır = öncekiSatırlar[i];
 
                if (canFind(seçiliSatır, "{"))
                {
 
                    writeln(öncekiSatırlar[i-1]);
                    yereller ~= Yerel(satır, öncekiSatırlar[i - 1]);
                    break;
                }
 
            }
            öncekiSatırlar = [];
 
        }
        öncekiSatırlar ~= satır;
    }
 
    writeln ("Yerelleri yazıyorum");
 
    foreach (yerel; yereller)
        writeln(yerel);
 
    File yeniDosya = File("yereller/Button.d.tr", "w");
 
    foreach (yerel; yereller)
        yeniDosya.writeln(yerel);
 
}
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 940 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kodun güncel hali de şu şekilde oldu:
import std.stdio;
import std.string;
import std.algorithm;
 
struct Yerel
{
    string kayıt;
    string bağlandığıYer;
 
    this(string kayıt, string bağlandığıYer)
    {
        this.kayıt = kayıt;
        if (canFind(bağlandığıYer, "("))
        {
            // write("Bağlandığı yer");
            // writeln(split(bağlandığıYer, "(")[0]);
            auto kısaltılmış = (split(bağlandığıYer, "(")[0]);
            this.bağlandığıYer = kısaltılmış;
        }
        else
        {
            this.bağlandığıYer = bağlandığıYer;
        }
 
    }
 
    string toString()
    {
        return format("%s|%s", kayıt, bağlandığıYer);
    }
 
}
 
void main()
{
    Yerel[] yereller;
 
    string dosyaİsmi = "eski/Button.d";
    auto parçalar = findSplit(dosyaİsmi, "/");
    string aranan = parçalar[parçalar.length - 1];
    auto arananParça = findSplit(aranan, ".")[0];
 
    // writeln("Aranan parça ", arananParça);
 
    File dosya = File(dosyaİsmi, "r");
 
    string[] öncekiSatırlar;
 
    while (!dosya.eof())
    {
        string satır = strip(dosya.readln());
 
        if (canFind(satır, "alias"))
        {
            // writeln(satır);
            // writeln("Önceki satırlar :");
            for (auto i = öncekiSatırlar.length - 1; i!= 0; --i)
            {
                auto seçiliSatır = öncekiSatırlar[i];
 
                if (canFind(seçiliSatır, "{"))
                {
 
                    // writeln(öncekiSatırlar[i-1]);
                    if (canFind(satır, arananParça))
                    {
                        yereller ~= Yerel(satır, "son");
                    }
                    else
                    {
                        yereller ~= Yerel(satır, öncekiSatırlar[i - 1]);
                    }
 
                    break;
                }
 
            }
            öncekiSatırlar = [];
 
        }
        öncekiSatırlar ~= satır;
    }
 
    writeln ("Yerelleri yazıyorum");
 
    foreach (yerel; yereller)
        writeln(yerel);
 
    File yeniDosya = File("yereller/Button.d.tr", "w");
 
    foreach (yerel; yereller)
        yeniDosya.writeln(yerel);
}
Çıktısı da şu şekilde:

$ ./yerellericek
Yerelleri yazıyorum
alias etiketÖğren = getLabel;|public string getLabel
alias etiketBelirle = setLabel;|public void setLabel
alias tıklandığında = addOnClicked;|gulong addOnClicked
alias Düğme = Button;|son
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 940 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yerelleri yeni kaynak dosyaya ekleyen bölümü de yazdım. Kod içinde en çok püf nokta gerektiren kısım burası olabilir. Çünkü kodu şu  şekilde kapsam parantezlerinden sonra eklemesi gerekiyordu.

    public string getLabel()
    {
        /+ .. +/
    }

    alias etiketÖğren = getLabel;


std.stdio ile std.file çakışıyormuş. Onu da şu şekilde hallettim.

alias write = std.stdio.write;

Yerelleri kaynak dosyaya ekleyen bölümün kodu şu şekilde:
// yerelleriyaz.d
import std.stdio;
import std.string;
import yardımcı;
import std.algorithm;
import std.file;
 
alias write = std.stdio.write;
 
Yerel[] yerelleriOku(string kütükİsmi)
{
    auto dosya = File(kütükİsmi, "r");
    Yerel[] yereller;
 
    while (!dosya.eof())
    {
        string satır = strip(dosya.readln());
        auto parçalar = split(satır, "|");
 
        if (parçalar.length > 0)
        {
            write(parçalar[0] ~ "-->");
            //write("Parçalar", parçalar);
 
            yereller ~= Yerel(parçalar[0], parçalar[1]);
        }
    }
 
    return yereller;
}
 
void yerelleriYaz(string kütükİsmi)
{
    auto kısaDosyaİsmi = dosyaİsminiGetir(kütükİsmi);
    auto yerelDosyaİsmi = "yereller/" ~ kısaDosyaİsmi ~ ".tr";
 
    writeln("Kısa dosya ismi", kısaDosyaİsmi);
 
    writeln("yerel dosya ismi :", yerelDosyaİsmi);
 
    auto yereller = yerelleriOku(yerelDosyaİsmi);
 
    string[] tümSatırlar;
 
    writeln("Yereller :");
 
    foreach (yerel; yereller)
        writeln(yerel);
 
    auto dosya = File(kütükİsmi, "r");
 
    int i = 0;
 
    while (!dosya.eof())
    {
        string satır = dosya.readln();
        tümSatırlar ~= satır;
        if (canFind (satır, yereller[i].bağlandığıYer))
        {
            writeln("Buldum:");
            write("Satır ...", satır);
            writeln("Kayıt ..", yereller[i].bağlandığıYer);
 
            while (!dosya.eof())
            {
                satır = dosya.readln();
                tümSatırlar ~= satır;
 
                write ("Satır -->", satır);
                if (canFind (satır, "}"))
                {
 
                    writeln("Konum", dosya.tell());
                    tümSatırlar ~= "\n";
                    tümSatırlar ~= '\t' ~ yereller[i].kayıt ~ '\n';
                    ++i;
                    break;
                }
            }
            // break;
 
        }
    }
 
    foreach (yerel; yereller)
    {
        if (yerel.bağlandığıYer == "son")
        {
            tümSatırlar ~= "\n";
            tümSatırlar ~= '\t' ~ yerel.kayıt ~ '\n';
        }
    }
 
    auto güncelDosyaİsmi = "güncel/" ~ kısaDosyaİsmi;
    auto yol = kısaDosyaİsmi.findSplit("/")[0];
    writeln ("Yol", yol);
 
    chdir ("güncel/");
    if (!exists(yol))
        mkdir(yol);
    chdir(yol);
    chdir("../");
    chdir("../");
 
    auto güncelKütük = File(güncelDosyaİsmi, "w");
 
    foreach (satır; tümSatırlar)
        güncelKütük.write(satır);
 
    writeln("Bulunduğum dizin", getcwd);
}
Yerel de basit bir yapı:
struct Yerel
{
    string kayıt;
    string bağlandığıYer;
 
    this(string kayıt, string bağlandığıYer)
    {
        this.kayıt = kayıt;
        if (canFind(bağlandığıYer, "("))
        {
            auto kısaltılmış = (split(bağlandığıYer, "(")[0]);
            this.bağlandığıYer = kısaltılmış;
        }
        else
        {
            this.bağlandığıYer = bağlandığıYer;
        }
 
    }
 
    string toString()
    {
        return format("%s|%s", kayıt, bağlandığıYer);
    }
}
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 940 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yerelleri ekleyen program kütüğün bir tanesinde çakıldı.

eski/gobject/ObjectG.d
Aranan parçaObjectG
Kütük ismi eski/gobject/ObjectG.d
Yerelleri yazıyorum
alias bildirimGeldiğinde = addOnNotify;|gulong addOnNotify
alias Nesne = ObjectG;|son
Kısa dosya ismi : ObjectG.d
Yolgobject
Büyüklük2
Bulunduğum dizin/home/erdem/Belgeler/dsoru
Kısa dosya ismigobject/ObjectG.d
yerel dosya ismi :yereller/gobject/ObjectG.d.tr
alias bildirimGeldiğinde = addOnNotify;-->alias Nesne = ObjectG;-->Yereller :
alias bildirimGeldiğinde = addOnNotify;|gulong addOnNotify
alias Nesne = ObjectG;|son
Satır -->    {
Satır -->        string signalName;
Satır -->       
Satır -->        if ( property == "" )
Satır -->            signalName = "notify";
Satır -->        else
Satır -->            signalName = "notify::"~ property;
Satır -->       
Satır -->        auto wrapper = new OnNotifyDelegateWrapper(dlg);
Satır -->        wrapper.handlerId = Signals.connectData(
Satır -->            this,
Satır -->            signalName,
Satır -->            cast(GCallback)&callBackNotify,
Satır -->            cast(void*)wrapper,
Satır -->            cast(GClosureNotify)&callBackNotifyDestroy,
Satır -->            connectFlags);
Satır -->        return wrapper.handlerId;
Satır -->    }
Konum7488
Satır -->     * is important state in the proxy object.
Satır -->     *
Satır -->     * Params:
Satır -->     *     notify = a function to call when this reference is the
Satır -->     *         last reference to the object, or is no longer
Satır -->     *         the last reference.
Satır -->     *     data = data to pass to @notify
Satır -->     *
Satır -->     * Since: 2.8
Satır -->     */
Satır -->    public void addToggleRef(GToggleNotify notify, void* data)
Satır -->    {
Satır -->        g_object_add_toggle_ref(gObject, notify, data);
Satır -->    }
Konum14987
core.exception.RangeError@yerelleriyaz.d(62): Range violation
??:? _d_arrayboundsp [0x4ba022]
??:? void yerelleriyaz.yerelleriYaz(immutable(char)[]) [0x4b7dd0]
??:? _Dmain [0x4a05a9]

Bakıyorum yerel dosyasında da hata yok gibi gözüküyor.

// ObjectG.d.tr

alias bildirimGeldiğinde = addOnNotify;|gulong addOnNotify
alias Nesne = ObjectG;|son


yerelleriyaz.d kütüğünde de hata veren kısım burası gözüküyor.
        if (canFind (satır, yereller[i].bağlandığıYer))
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4481 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Dosyanın sonunda boş satır bulunmaması ile ilgili bir sorun olabilir. D'de nasıl olduğunu hatırlamıyorum ama eof() true döndürmediği halde dosyada satır kalmamış olabiliyor.

Yani, D runtime'a güveniyorum ve yereller'de i'inci eleman olmadığını düşünüyorum. yereller.length'i hemen öncesinde yazdırmayı deneyebilirsin.

Ali
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 940 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sorun yerelleriyaz.d kütüğündeki yerel bilgileri ile güncel kaynak kodu birleştiren kısımdan kaynaklanıyormuş.

Aslında biraz mantıksız olsa da şöyle yaptım.
 
        if (i == yereller.length)
            i = 0;
Kodda da hala hatalar var ya da iyileştirmeler yapılabilir.

Örneğin:

    this(uint interval, bool delegate() dlg, bool fireNow=false)
    {
        timeoutListeners ~= dlg;
        timeoutID = g_timeout_add(interval, cast(GSourceFunc)&timeoutCallback, cast(void*)this);
        if ( fireNow )
        {
            if ( !dlg() )
            {
                timeoutListeners.length = 0;
            }
 
    alias dur = stop;
        }
    }
Gördüğünüz gibi alias ifadesini kapama parantezlerinden sonra koyması gerekirken işlevin içine atmış. Bunun dışında alt alta bir kaç tane alias tanımlaması yapıldığında bunları doğru alamadığını farkettim.

Aslında bu basit bir soru gibi gözükse de naçizane kanaatim işe alma için mülakat sorusu olabilir.

Sonra en iyileştirme yapılacak bölümlerden birisi de elimizde yereller var ve bunu güncel kaynak dosyayla birleştirmek istiyoruz. İşte belki de bu programın en püf noktalarından bir tanesi. Çünkü kaynak kodun ortasını veriler yazıyoruz, kapama parantezlerinden ( kod bloklarından) sonra yazmak istiyoruz. Sonra alt alta bulunan alias tanımları var.

Dosyada gezinirken auto konum = kütük.tell() şeklinde de gezebiliyormuşuz. Sonra değişikliklerin takibi için belki hash kütüklerinden faydalanılabilir.
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1908 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Burada yapılmak istenen, kod yazılırken otomatik şekilde kod eklemek mi, anlayamadım?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #9
Üye Tem 2009 tarihinden beri · 940 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Burada yapılmak istenen gtkd kütüphanesinin 3.5.1 sürümündeki yerel tanımlamalarını çekip gtkd'nin 3.6.6 sürümüne aktarmaktı.

Örnek olarak bir yerel şuna benziyor.

https://github.com/erdemoncel/gtkd/blob/master/bak%C4%B1m/…
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-09-26, 07:40:36 (UTC -07:00)