Forum: Duyurular RSS
KelimeMatik Projesi
Yine, yeni, yeniden
zafer #1
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: KelimeMatik Projesi
Merhaba,

D dilinde öğrendiklerimi pekiştirmek adına küçük bir proje yapıyorum. KelimeMatik adındaki projem ile amacım ingilizce öğrenme aşamasında olan kişilerin ingiilzce kelimelere aşinalıklarını arttırmak için kelimelerin türkçe karşılıklarını yazarak çalışabilecekleri küçük bir egzersiz programı hazırlamak.

Her nekadar buradaki büyük topluluğun çok yoğun işleri olduğu için katılamayacaklarını blsemde biz usulen yinede duyurumuzu yapalım dedim. :-)   Projeye maddi manevi her türlü desteği bekleriz.  :-D

Şöyle bir bakayım bu ne menem bişeymiş diyenler için adresimiz : https://github.com/zafer06/KelimeMatik

Not: Maddi destekler için lütfen hesap no isteyiniz. :-D
https://github.com/zafer06 - depo
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 de vakit buldukça bakabileceğim ama gelişmelerden haberdar etmeyi unutma lütfen. :)

Küçük bir bilgi olarak, dosyaya satır satır eriştiren byLine()'dan yararlanabiliriz:

    foreach (satır; dosya.byLine()) {
        writeln(satır);
    }

Teknik açıklaması: byLine(), ByLine türünde aralık döndürür. ByLine aralıkları tembeldir; elemanları, dosyanın satırlarından oluşur.

Ali
zafer #3
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Doğrusunu söylemek gerekirse hem öğrenme amaçlı hemde denemek için byLine() metodunu kullanmaya çalıştım ama bazı hatalarla karşılaştım.

Önceklikle örnekteki gibi direk satırı yazdırmayı denedim bir sorun yoktu. Sonrasında projeye entegre etmeye çalıştığımda split metotunda aşağıdaki hatayı aldım.

main.d(11): Error: cannot implicitly convert expression (split(satir,":")) of type char[][] to string[]

Teknik açıklaması: byLine(), ByLine türünde aralık döndürür. ByLine aralıkları tembeldir; elemanları, dosyanın satırlarından oluşur.

Ben hala Aralıklar konusuna gelemedim. Sınıflar ve şablonları bitirdim, sınıflarda çok sorun yaşamadım ama şablonlara yabancı olduğun için olsa gerek okudum anladım ama kullanımı hala kafamda tam olarak netleşmedi.

ByLine şurada yapı olarak görünüyor http://www.d-programming-language.org/phobos/std_stdio.htm… ama tam anlayamadım, Bu arada aklıma takıldı bu ByChunk nedir?

Ayrıca kelimelerin doğru olup olmadıklarını kontrol ederken iki tarafıda küçük harfe çevirip kontrol ediyorum, Tabi bu durumda I ve i lerde sorun oluyor. Sanırım trileri projesinden faydalanmam gerekecek ama o projenin ekleyebileceğim bir kütüphane dosyasını bulamadım. Bu konuda ve byLine() konusunda yardım istiyorum,
https://github.com/zafer06 - depo
acehreli (Moderatör) #4
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ı
zafer:
Sonrasında projeye entegre etmeye çalıştığımda split metotunda aşağıdaki hatayı aldım.

main.d(11): Error: cannot implicitly convert expression (split(satir,":")) of type char[][] to string[]

Nasıl yaptığını hata mesajına bakarak tahmin ediyorum; şu çalışıyor:

import std.string;
import std.stdio;
 
void main()
{
    auto dosya = File("deneme.txt");
 
    foreach (satır; dosya.byLine()) {
        char[][] parçalar = split(satır, ":");
        writeln(parçalar);
    }
}

Şu çalışmıyor:

        string[] parçalar = split(satır, ":");

Çünkü split değişebilen karakterli dizgiler döndürüyor. Ama zaten şu belgede std.string.split yerine daha genel olan std.array.split'in kullanılması öneriliyor:

http://www.d-programming-language.org/phobos/std_string.html

Belki sen de onu deniyorsundur. (Neden göstermiyorsun? ;)). std.string yerine std.array ile de aynı durum...

std.array'in belgesinde split'in tanımı şöyle:

Unqual!(S1)[] split(S1, S2)(S1 s, S2 delim);

Unqual, "unqualified"dan geliyor. Anlamı, ona verdiğimiz S1'in const, immutable, vs. bütün belirteçlerinin kaldırılmış olanı. Yani split, ürettiği sonucun değişebilen veri olduğunu belgeliyor. Kullanışlı bir şey; çünkü biz de bunu bilerek parçaları değiştirebiliriz.

Ama değiştirmek istemediğimiz bu örnekte tür dönüşümü yapılabilir:

        string[] parçalar = cast(string[])split(satır, ":");

Tamam, artık çalışıyor.

şablonlara yabancı olduğun için olsa gerek okudum anladım ama kullanımı hala kafamda tam olarak netleşmedi

Baştan öyle geliyor ama bir kere alışınca çok mantıklı. Hemen hemen her şeyi şablon yapmak istiyorsun. :) Şablonların çok karmaşık olanakları da var ama en sık kullanılan olanaklar çok basit. Bence o dersteki şu iki örnek basit:

1)

void parantezliYazdır(T)(T değer)
{
    writefln("(%s)", değer);
}

Her tür değeri parantezli yazdırabiliyor. Neden int, double, vs. için ayrı ayrı yazalım diye düşününce o kadar kolay.

2)

struct Nokta(T)
{
    T x;
    T y;
}

Koordinat olarak her tür kullanabiliyor. double, int, BigNum, vs. için farklı nokta türleri tanımlamaya gerek yok. Kolay. :)

ByChunk nedir?

"chunk" parça, öbek, demek. Dosyayı belirli büyüklükte parçalar halinde okumaya yarıyor. Parçalar ubyte dizisi olarak beliriyorlarmış. Örnekte görüldüğü gibi son okumada dizinin uzunluğu istenenden (4096'dan) daha kısa olabiliyormuş.

trileri projesinden faydalanmam gerekecek

Çok sevinirim. Böylece deneme olanağı bulmuş oluruz ama hem eksikleri var hem de 2.055 ile derlenemiyor. Düzelteceğim. :)

Ali
zafer #5
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Çalıştığım dillerde bu tür işlemleri hep string türü ile çalıştığım için aklım hep ona gidiyor. Char dizileri belkide alışık olmadığım için bana biraz yabancı geliyor belki tersi bir durumda senin için geçerlidir.

Diğer taraftan bu string türünün değiştirilemez olması hala kafamı karıştırıyor. Yani evet string ifadenin bir karakterine ulaşıp değiştiremiyoruz ama örneğin string bir değişkene başka bir değer atayabiliyoruz.

import std.stdio;
 
void main()
{
    string test = "zafer";
 
    test[2] = 'a';
 
    writeln(test);
}

Bu kod aşağıdaki hatayı üretiyor ve değiştiremeyeceğimizi söylüyor.

main.d(7): Error: test[2] isn't mutable

import std.stdio;
 
void main()
{
    string test = "zafer";
 
    test = "ali";
 
    writeln(test);
}

Yukarıdaki kodda ise hiçbir sorun olmadan değişikliği yapabiliyorum. Bu noktada stringin değiştirilemez olması biraz kafamı karıştırıyor. test değişkeninin önceki değeri "zafer" iken şimdi "ali" oldu dolayısıyla değiştiğini düşünüyorum. Acaba şöyle mi düşünmek gerekir, ben ikinci atamayı yaparken aslında ilk değişken tamamen silinip yerine aynı isimli yeni bir değişken oluşturuluyor dolayısıyla aslında ben değiştirmiyor silip yeniden oluşturuyorum. Ancak o durumda da bellekteki adreslerinin değişeceğini düşündüm ve kodu şu hale getirdim.

import std.stdio;
 
void main()
{
    string test = "zafer";
 
    writeln(test, " -> ", &test);    
 
    test = "ali";
 
    writeln(test, " -> ", &test);    
}

Bu kodun bendeki çıktısı ise şu şekilde görünüyordu. (Çalıştığım sistem : Debian 6)

zafer@debian:~/Belgeler$ dmd -w main.d
zafer@debian:~/Belgeler$ ./main
zafer -> FFE0D948
ali -> FFE0D948
zafer@debian:~/Belgeler$

Sen ne dersin Ali bu konudaki düşünce tarzı nasıl olmalı?

Belki sen de onu deniyorsundur. (Neden göstermiyorsun? ;)). std.string yerine std.array ile de aynı durum...

Sakladığımız birşey yok herşey alenen ortada zaten depomuzda belli :) Neyse şaka bir tarafa biraz aceleye geldi  sanırım yoksa genelde mesajlarıma ilgili kod bölümlerinide eklemeye çalışırım.Konu bütünlüğü açısından daha faydalı oluyor.

Evet bende önce doğal olarak std.string modülünde tanımlı olana yöneldim ancak o bağlantıda okuduğum ve şu an hatırlamadığım bir mesaj üzerine bende std.array modülündekini kullanmaya başlamıştım.

Bu arada bu konu üzerine aklıma bir şey takıldı. Mesala ben hem std.string hemde std.array modüllerini import etsem ve kodun içinde split() metodunu çağırsam hangi modüldeki split() metodunu çağırmış olurum. Böyle karışıklıklar yaşanır mı?

Baştan öyle geliyor ama bir kere alışınca çok mantıklı. Hemen hemen her şeyi şablon yapmak istiyorsun. :) Şablonların çok karmaşık olanakları da var ama en sık kullanılan olanaklar çok basit

Şablonlar konusunda bilgisi olan sensin güzel bir özellik diyorsan bana uyar ancak benim kafama takılan böyle güzel bir özelliğin diğer dillerde neden yer bulamadığı sorusu, belki vardır tam olarakta bilmiyorum tabi.

Çok sevinirim. Böylece deneme olanağı bulmuş oluruz ama hem eksikleri var hem de 2.055 ile derlenemiyor. Düzelteceğim. :)

Bekliyorum, mümkünse bir kütüphane haline getirisek daha kullanışlı olur diye düşünüyorum ama her türlü uygun olur, çalışsında :)
https://github.com/zafer06 - depo
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ı
zafer:
Çalıştığım dillerde bu tür işlemleri hep string türü ile çalıştığım için aklım hep ona gidiyor.

Ben C++'tan geldiğim için string türü ve aslında onun içinde gizli olan immutable kavramı bana garip gelmişti.

Diğer taraftan bu string türünün değiştirilemez olması hala kafamı karıştırıyor. Yani evet string ifadenin bir karakterine ulaşıp değiştiremiyoruz ama örneğin string bir değişkene başka bir değer atayabiliyoruz.

O bana da çok garip geliyor. "Karakterini değiştirmene izin vermiyorum ama başına, sonuna, vs. ekleme yapabilirsin" garip bir şey.

Sesli düşünüyorum:

  • her tarafı değişebilen dizgi: char[]

  • karakterleri değişemeyen dizgi: immutable(char)[] (takma ismi: string)

  • hiçbir tarafı değişemeyen dizgi: immutable(char[]) (bu aslında parantezsiz olarak 'immutable char[]' diye de yazılır)

Sesli düşünmeye devam:

  • const: veriyi bu ismi kullanarak değiştirmeme sözünü verir, ama o veri başka tarafta aslında değişebilen bir veri olabilir

  • immutable: programda hiçbir biçimde değişemez

    string test = "zafer";
 
    test = "ali";

Yukarıdaki kodda ise hiçbir sorun olmadan değişikliği yapabiliyorum. Bu noktada stringin değiştirilemez olması biraz kafamı karıştırıyor.

Aynı karışıklık bende de var. :)

ben ikinci atamayı yaparken aslında ilk değişken tamamen silinip yerine aynı isimli yeni bir değişken oluşturuluyor

EDIT Siliyorum: Senin de gördüğün gibi o düşünce tarzı doğru değil.

'test' ismindeki değişkenin yeri degişmez. 'new' ile de oluşturulmadığı için program yığıtında durur. Onun erişim sağladığı karakterler ise D çalışma ortamı (D runtime) tarafından sahipli olarak dinamik bellek bölgesinde durur.

Sen D.ershane'de hep benden bir kaç adım önde gidiyorsun. ;) Şu bölümde:

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

"Dizilerin .ptr niteliği" başlığında dizilerin (ve doğal olarak dizgilerin) .ptr niteliği gösteriliyor. Ondan sonra "ubyte göstergesi ile belleğin incelenmesi" başlığında ilginç kodlar var. Bu konuyla ilgili olanı ise o başlığın sonundaki "Gözlemler"in üçüncü maddesi.

Orada string'in perde arkasında şöyle tanımlı olduğunu düşünmemiz gerektiğini söylüyorum:

struct __string
{
    int uzunluk;
    char * ptr;    // asıl karakterler
}

(Not: Daha genel olarak tanıtmalıymışım; çünkü aslında bütün diziler öyle tanımlıdırlar.)

Yani &test yaptığın zaman o yapı değişkeninin adresini görüyorsun. main içinde o değişmez. Karakterlerin yerleri için test.ptr'ın değerini yazdırmalısın.

EDIT Siliyorum: Tahminim, "ali" yaptıktan sonra bile değişmeyecektir. Çünkü "zafer" için zaten ayrılmış olan eski yere "ali" karakterleri gelecek ve veri olarak "alier" olacak.

Konu dağıldı. :) Bunlar string'in yalnızca karakterlerinin değişmezliğinin garip olduğu gerçeğini değiştirmiyor. Özetle seninle aynı fikirdeyim. :)

hem std.string hemde std.array modüllerini import etsem ve kodun içinde split() metodunu çağırsam hangi modüldeki split() metodunu çağırmış olurum. Böyle karışıklıklar yaşanır mı?

Normalde hem yaşanır hem yaşanmaz. :) Ama string.d'den split'i zaten çıkartmışlar ve array'dekini getirmişler. dmd/src/phobos/std/string.d'in içinde şu var:

public import std.array : join, split;

Yani join ve split'i array'den alıp kullanıma sunuyorlar.

Daha genel olarak, a.d'de ve b.d'de bulunan foo() isminde işlev varsa:

  • Eğer kullanım biçimi ikisine de uyuyorsa karışıklık olur. Çözüm olarak uzun isim yazılarak kullanılabilir: a.foo(...). Veya ona yeni bir isim verilebilir ve o kullanılır: 'alias a.foo benim_foo;'

  • Eğer kullanım biçimi yalnızca birisine uyuyorsa sorun yok; derleyici hangisi olursa onu kullanıyor. Ama bu kural biraz karışık; çünkü bazen biri int, diğeri long parametre aldığı için her ikisine de uyabilir. Sanıyorum o zaman programcı yanılmış olmasın diye hata mesajı geliyor. (Başımıza gelince düşünürüz. :))

Şablonlar konusunda ...böyle güzel bir özelliğin diğer dillerde neden yer bulamadığı sorusu, belki vardır tam olarakta bilmiyorum tabi.

Tarihçesini bilmiyorum ama ben C++'ta öğrenmiştim. C++'ın en güçlü yanlarından olarak bilinir. (D'nin şablonları daha da güçlü. :)) Türden bağımsız topluluklar ve algoritmalar olmazsa olmaz! :) Daha sonradan Java'ya da "generics" ismiyle getirildi ama onlarınkinin bazı yetersizlikleri vardı galiba. (Bilmiyorum.)

Şablonların sözü çoğu dinamik dilde geçmez çünkü "her türle kullanım" o dillerin doğasında vardır. Örneğin Python'da zaten bütün işlevler şablon gibidirler. İşlev içindeki kullanıma uyan her tür o işleve gönderilebilir ve kullanılabilir (ördek tipleme: "duck typing").

Ali
Bu mesaj acehreli tarafından değiştirildi; zaman: 2011-10-20, 12:10.
acehreli (Moderatör) #7
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ı
Yukarıda yanlış bilgi veriyorum!

zafer:
ben ikinci atamayı yaparken aslında ilk değişken tamamen silinip yerine aynı isimli yeni bir değişken oluşturuluyor

Söylediklerin doğru. Benim karakterlerin değişeceği ile ilgili bilgilerim yanlış.

Ali
zafer #8
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Neyse bu konuya fazla takılmıyorum. Diğer herşey gibi kuralına uygun olrak kullandığımızda sanırım bir sorun yaşamayacağız.

Tarihçesini bilmiyorum ama ben C++'ta öğrenmiştim. C++'ın en güçlü yanlarından olarak bilinir. (D'nin şablonları daha da güçlü. :)) Türden bağımsız topluluklar ve algoritmalar olmazsa olmaz! :) Daha sonradan Java'ya da "generics" ismiyle getirildi ama onlarınkinin bazı yetersizlikleri vardı galiba. (Bilmiyorum.)

Şablonların sözü çoğu dinamik dilde geçmez çünkü "her türle kullanım" o dillerin doğasında vardır. Örneğin Python'da zaten bütün işlevler şablon gibidirler. İşlev içindeki kullanıma uyan her tür o işleve gönderilebilir ve kullanılabilir (ördek tipleme: "duck typing").

Haklısın diğer dillerde şablon değil ama generic programlama adı altında temelde aynı yapı kullanıma sunulmuş, daha öncede karşılaşmıştım ama bir türlü tanışma olanağımız olmamış :)

Bu arda şu ördek tiplemeyi sevdim, ne güzel isim o öyle :)
https://github.com/zafer06 - depo
acehreli (Moderatör) #9
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ı
Wikipedia'ya bakılırsa bilgisayar teknolojileri dışında kullanılan bir "ördek testi" imiş:

"When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck."

"Gördüğüm kuş ördek gibi yürüyorsa, ördek gibi yüzüyorsa, ördek gibi vak vaklıyorsa, ben o kuşa ördek derim." :)

Bilgisayarlarda da türün kullanım olarak uygunluğunu tarif eder. Örneğin, "empty(), front(), ve popFront() işlevleri bulunan her tür InputRange'dir."

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:
Forum: Duyurular RSS
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, 04:30:09 (UTC -08:00)