Thread overview
KelimeMatik Projesi
Oct 17, 2011
zafer
Oct 19, 2011
zafer
Oct 19, 2011
zafer
Oct 20, 2011
zafer
October 17, 2011

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 *

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

October 18, 2011

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

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

October 19, 2011

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.

Alıntı:

>

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

Alıntı:

>

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.html#ByLine 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,

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

October 19, 2011

Ç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.

Alıntı:

>

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)

Alıntı:

>

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ı?

Alıntı:

>

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ı?

Alıntı:

>

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.

Alıntı:

>

Ç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 :)

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

October 19, 2011

Alıntı (zafer):

>

Sonrasında projeye entegre etmeye çalıştığımda split metotunda aşağıdaki hatayı aldım.

Alıntı:

>

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.

Alıntı:

>

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

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.

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. :)

Alıntı:

>

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

Alıntı:

>

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

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

October 20, 2011

Alıntı (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.

Alıntı:

>

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

Alıntı:

>
>     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. :)

Alıntı:
> 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. :)

Alıntı:
> 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. :))

Alıntı:
> Ş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 gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
October 20, 2011

Yukarıda yanlış bilgi veriyorum!

Alıntı (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

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

October 21, 2011

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.

Alıntı:

>

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 :)

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

October 21, 2011

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

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