Jump to page: 1 2
Thread overview
January 15, 2010

Başlıktaki gibi yapılar tanımlamak nasıl olur? Kendi gereken işleçlerini yükleyerek char ve string gibi kullanılabilirler.

D'nin 'alias this' olanağı, bir türün otomatik olarak başka bir tür yerine geçmesini sağlıyor. Ondan da yararlanarak, örneğin 'trchar''ı otomatik olarak 'dchar' yerine de kullanabiliriz (acaba 'char' mı olmalı? :)):

Aklıma ilk gelen:

struct trchar
{
   dchar c_;

   this(dchar c)
   {
       c_ = c;
   }

   alias c_ this;
}

void dcharBekleyenİşlev(dchar c)
{
   dout.writefln(c);
}

// ...

   auto ğ = trchar('ğ');
   dcharBekleyenİşlev(ğ);

Örneğin < işlecini Türk alfabesine göre yükleyebiliriz. Hatta toUniLower işlevini de bu tür için yüklersek, kullanıcılar toUniLower_tr'yi özel olarak çağırmak zorunda kalmazlar, ve hatta yanlışlık da yapamazlar.

Buna bakmak isteyen var mı?

Ali

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

January 16, 2010

Evet güzel gibi duruyor. Çünkü biz sadece phobos'un Türkçeye uygun olmayan yanlarını çevirdik. Ama bu biçimde kolaylıkla tango( Lütfen tangonun net modülüne bakın. İçimden bir ses orada bir siteden dosya indirmek için gerekli işlevlerin yazıldığını söylüyor :-D ) gibi kütüphaneleri de kullanabiliriz(Değil mi ?).

Ama bunu nasıl yapacağımızı tam anlamadım. (Yapıları da daha tam olarak anlamadım.)

Bunun temelinde okul arası çok göz gezdirememiş olmam. Şuan okul yarıyıl tatiline girdi gibi bir şey olduğu için dershaneye bilmediğim yerlere bakmaya çalışıyorum.

Ama bu kodlar ile ne yaptığımızı anlamadım. Burada 'a' karakterini ortaya koyarsak 'a' karakteri aslında string. Ama biz bunu dchar gibi davranmasını sağlıyoruz. Ama aslında 'a' karakteri dchar çevirmemiş olduk. Sadece işlev dchar sanacak.

Eğer bunu ğ ile deneseydik dchar olmasına karşın 2 bayt mı olmalıydı ?

En iyisi bu kodları deneyip neyin ne olduğunu anlamaya çalışayım.

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

January 16, 2010

Derleyemedim.

Verilen hata:

isimsiz.d(23): Error: variable isimsiz.ğ conflicts with variable isimsiz.ğ at isimsiz.d(22)

Çakışan değişkenler:

   auto ğ = trchar('ğ');
   dcharBekleyenİşlev(ğ);

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

January 16, 2010

Alıntı (canalpay):

>

kolaylıkla tango( Lütfen tangonun net modülüne bakın.

Duyduklarıma bakılırsa Tango çok güzel bir kütüphane; ama ben bir süre odağımı kaybetmek istemiyorum. :)

Alıntı:

>

İçimden bir ses orada bir siteden dosya indirmek için gerekli işlevlerin yazıldığını söylüyor :-D ) gibi kütüphaneleri de kullanabiliriz(Değil mi ?).

Eğer bu türler otomatik olarak dchar ve dstring'e dönüşürlerse, herhangi bir kütüphane ile kullanabiliriz.

Alıntı:

>

(Yapıları da daha tam olarak anlamadım.)

class'lardan çok farklı değiller: ikisi de başka türleri bir araya getirerek yepyeni tür tanımlar.

En önemli fark: yapılar değer türüdür, sınıflar referans türüdür.

C ve C++'da her şey değer türü olduğu için sınıfların referanslığına alışmam gerekiyor. :) (İstisna olarak, C ve C++'da diziler bu ikisinin arasında bir şeydir.)

Alıntı:

>

Bunun temelinde okul arası çok göz gezdirememiş olmam.

Gereksiz tekrar olacak ama okul önemli... :)

Alıntı:

>

Ama bu kodlar ile ne yaptığımızı anlamadım. Burada 'a' karakterini ortaya koyarsak 'a' karakteri aslında string.

'char' demek istedin tabii. ("a" olsa string olurdu.)

Alıntı:

>

Ama biz bunu dchar gibi davranmasını sağlıyoruz. Ama aslında 'a' karakteri dchar çevirmemiş olduk. Sadece işlev dchar sanacak.

Elimizde bir trchar olacak. Onun türü hiç değişmeyecek. Karşılaştırmasını filan kendi kuralların göre yapacak.

Kendisi farklı bir tür olarak kullanılmak istendiğinde, c_ üyesini kullanacak. 'alias c_ this', "benim yerime c_" kullanılabilir gibi bir anlama geliyor.

Alıntı:

>

En iyisi bu kodları deneyip neyin ne olduğunu anlamaya çalışayım.

Denemek iyi... :)

Bu arada, işlev yükleme konusu çok işe yarayacak. trchar'ları Türkçe kuralına göre karşılaştırmak şu kadar kolay olmalı (derlemedim):

import tr.uni;

trchar toUniLower_tr(in trchar karakter)
{
   return trchar(toUniLower_tr(karakter.c_));
}

O işlev sayesinde artık trchar'ları da küçültebiliyoruz. İşini, uni.d'de tanımladığımız ve dchar kullanan toUniLower_tr'ye havale ediyor.

Böylece kütüphaneye trchar diye bir tür eklemiş olacağız.

Onun içine opCmp'un da mutlaka eklenmesi gerek. O da tr.string içindeki sıra numaralarından yararlanır.

Ali

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

January 16, 2010

Ben dmd 2.039 ile şunu derleyebiliyorum ve çalışıyor:

import std.cstream;

struct trchar
{
   dchar c_;

   this(dchar c)
   {
       c_ = c;
   }

   alias c_ this;
}

void dcharBekleyenİşlev(dchar c)
{
   dout.writefln("işlev içinde: ", c);
}

void main()
{
   auto ğ = trchar('ğ');
   dcharBekleyenİşlev(ğ);
}

Ali

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

January 17, 2010

Benim anladığım bir tür belirliyoruz. O türe istediğimiz özellikleri yüklüyoruz. Ve en sonunda o türün dchar gibi başka bir türün yerine geçmesini istiyoruz.(Yani aslında dchar türünü en baştan tasarlıyoruz, çok iyi bir olanak.)

Benim fikirlerim:

  1. char[] yerine string olmalı bence. (Çünkü phobos öntanımlı olarak string kabul ediyor.)
  2. Sadece dizgilerde çalışmamalı. Karakterlerde de çalışmalı. Bu da tabiki immutable char olmalı.
  3. Bence her ne kadar immutable char ile bu yapıyı çağırsakta istersek dchar gibi türlerle de çağırabilmeliyiz. Ondan sonra çağırdığımız türü string yada immutable char'a çeviririz. Daha sonra yapı kaldığı yerden devam eder.
  4. Ee bu birden fazla tür ile çalışacak(en basitinden hem string hem de immutable char) bu yüzden adı trstring gibi belirli bir ad olmamalı.
    Ben trtür, trimmutable ,trdeğişmez gibi adlar olabilir.(Şimdi hatırladım. Tango char'a Mut-8 dchar'a Mut-32 diyordu. Bizde trimmut-8 adını verebliriz.)

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

January 17, 2010

Alıntı:

>

Bu arada, Türkçe harflerin char'a sığmadıklarını da hatırlamak gerek. En küçük wchar olmalı...

Ama kütüphane için tekrar string'e dönüştürmek gerekecek değil mi ? Yani yinede sığmayacak. Sadece sonuca daha erken varmış olacağız :-) Ayrıca char'ı tekrar wchar yaptığımızda bu sefer sığmayan şey sığmış olacak.

Diğer dediklerinize de yanıtlayacaktım ama kısaca :

auto ş = tr!dchar('ş');

Eğer böyle yapabiliyorsak böyle yapalım ama yapamıyorsak tabiki immutable char olmalı. Neden mi ? Çünkü immutable charı daha çok kullanıyoruz.(phobostan dolayı).

   tr!wchar[] merhaba = "merhaba";

Ben ayrıca trwchar[] diye tanımlayalım dememin nedeni whar[] şeklinde tanımlayamamdı. Sizce wchar[] şeklinde tanımlayabilir miyiz?

   TT to(TT)()
   {
       return cast(TT)c_;
   }

Anlamadığım yerler var. 2 T ne işe yarıyor.(tahmin !wchar da işe yarıyor.)

Şuan yapmak istediklerimiz(Bence):

1.tr!(istediğimizTür)('s');
2.tr!(istediğimiztüründizgisi[])("deneme");

Birincisini verdiğiniz kodlar hallediyor.Ama bana asıl sorun ikinci kodlar gibi geldi. Çünkü siz bu kodları vermeden öncede denemiştim ama pratik bir yolunu bulamadım.

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

January 17, 2010

Bu arada, Türkçe harflerin char'a sığmadıklarını da hatırlamak gerek. En küçük wchar olmalı...

Alıntı (canalpay):

>

Benim anladığım bir tür belirliyoruz. O türe istediğimiz özellikleri yüklüyoruz. Ve en sonunda o türün dchar gibi başka bir türün yerine geçmesini istiyoruz.

Evet. Otomatik olarak başka türlerin yerine geçmesi hem iyi, hem de kötü. Kavramsal olarak sonuçta bir karakter olduğu için, otomatik dönüşüm mantıklı ve kolay olur.

Öte yandan, başka her otomatik dönüşümde olduğu gibi, bazen farkedilmeden ve istenmeden dönüşmesinin yolunu da açar.

Bunu biraz daha düşünmek gerek. Belki 'to!string' gibi bir işlev düşünebiliriz. Serbest işlev de olabilir, üye de...

Alıntı:

>
  1. char[] yerine string olmalı bence. (Çünkü phobos öntanımlı olarak string kabul ediyor.)

Kabul ama dizginin değiştirilebilir olmasını da isteyeceğiz. string, 'immutable char[]' olduğu için değiştirilemiyor.

Alıntı:

>
  1. Sadece dizgilerde çalışmamalı. Karakterlerde de çalışmalı. Bu da tabiki immutable char olmalı.

Zaten karakteri temsil eden bir tür, ve onun dizi halini temsil eden bir tür gerekiyor... diye düşünmüştüm... Ama şimdi düşününce, aslında karakteri tanımlamak yeterli.

Dizgi, temel dizgilerde de olduğu gibi, onun dizi hali olur: 'trchar[]' veya, belirteciyle birlikte: 'immutable trchar[]' vs.

Alıntı:

>
  1. Bence her ne kadar immutable char ile bu yapıyı çağırsakta istersek dchar gibi türlerle de çağırabilmeliyiz. Ondan sonra çağırdığımız türü string yada immutable char'a çeviririz. Daha sonra yapı kaldığı yerden devam eder.

Güzel.

Alıntı:

>
  1. Ee bu birden fazla tür ile çalışacak(en basitinden hem string hem de immutable char) bu yüzden adı trstring gibi belirli bir ad olmamalı.
    Ben trtür, trimmutable ,trdeğişmez gibi adlar olabilir.(Şimdi hatırladım. Tango char'a Mut-8 dchar'a Mut-32 diyordu. Bizde trimmut-8 adını verebliriz.)

Veya, bir yapı şablonu olur ve biz 'tr!char', 'tr!dchar', 'tr!(immutable char)' gibi çağırabiliriz. (Biliyorum, çok çirkin, ama onlara 'alias' ile güzel isimler verebiliriz. :) )

Şöyle bir şey denedim:

import std.cstream;

struct tr(T)
{
   T c_;

   this(T c)
   {
       c_ = c;
   }

   TT to(TT)()
   {
       return cast(TT)c_;
   }

   alias T this;
}

void dcharBekleyenİşlev(dchar c)
{
   dout.writefln("işlev içinde: ", c);
}

void immutable_wchar_bekleyen_işlev(immutable wchar c)
{
   dout.writefln("immutable alan işlevde: ", c);
}

void main()
{
   // wchar
   auto ğ = tr!wchar('ğ');
   dcharBekleyenİşlev(ğ.to!dchar);
   immutable_wchar_bekleyen_işlev(ğ.to!(immutable wchar));
   dout.writefln("wchar: %s dchar: %s", ğ.to!wchar, ğ.to!dchar);

   // dchar
   auto ş = tr!dchar('ş');
   dcharBekleyenİşlev(ş.to!dchar);
   immutable_wchar_bekleyen_işlev(ş.to!(immutable wchar));
   dout.writefln("wchar: %s dchar: %s", ş.to!wchar, ş.to!dchar);

   // Böyle bir şey de gerçekleştirmek gerek
//     tr!wchar[] merhaba = "merhaba";
}

Ali

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

January 17, 2010

Alıntı (canalpay):

>

Alıntı:

>

Bu arada, Türkçe harflerin char'a sığmadıklarını da hatırlamak gerek. En küçük wchar olmalı...

Ama kütüphane için tekrar string'e dönüştürmek gerekecek değil mi ?

Kesinlikle.

Alıntı:

>

Yani yinede sığmayacak.

Bir Türkçe harfi tek bir char'a yerleştirmek olanaksız; çünkü char, Unicode karakteri değil; onu oluşturan kodları içerebiliyor. (ASCII için bunlar bire bir.)

Ama D, wchar'ı bile bir char[]'a yerleştirmeye izin veriyor:

import std.cstream;

void main()
{
   wchar w = 'ğ';
   char[] dizgi;
   dizgi ~= w;

   dout.writefln("uzunluk: ", dizgi.length);   // 2 yazar
}

Eğer Türkçe harf gibi davranan bir yapı olacaksa, o da kendisini bu şekilde kullandırabilmeli.

D'nin iç olanak olarak sunduğu karakter ve dizi davranışlarını bir gözden geçirmek gerek.

Alıntı:

>

Sadece sonuca daha erken varmış olacağız :-) Ayrıca char'ı tekrar wchar yaptığımızda bu sefer sığmayan şey sığmış olacak.

Anlıyorum.

Alıntı:

>

Diğer dediklerinize de yanıtlayacaktım ama kısaca :

> auto ş = tr!dchar('ş');
> ```

> Eğer böyle yapabiliyorsak böyle yapalım ama yapamıyorsak tabiki immutable char olmalı. Neden mi ? Çünkü immutable charı daha çok kullanıyoruz.(phobostan dolayı).

Öte yandan, 'immutable' her türe uygulanabilen bir depolama türü. Biz yalnızca türü tanımlayınca onu zaten immutable yapabileceğiz. Yani immutable'lığı özellikle türün parçası haline getirmenin gerektiğini düşünmüyorum.

Ama olabilir de aslında. Örneğin iki char'dan oluşan Türkçe harf sabitleri olursa, onların karakterleriyle teker teker oynamak yasal olmamalıdır.

Alıntı:
>
>
>
tr!wchar[] merhaba = "merhaba";
>

Ben ayrıca trwchar[] diye tanımlayalım dememin nedeni whar[] şeklinde tanımlayamamdı.

Başka şablonlardan doğru tür olarak çağırabilmek için, bizimkinin de şablon olmasında yarar var:

void foo(KarakterTürü)()
{
   tr!KarakterTürü k;
}

Yani, şablon olursa, foo'ya gönderilen karakter türü ne olursa olsun, doğru Türkçe harf seçilir.

alias ile nasıl olsa kullanışlı adlar da verilebiliyor:

alias tr!wchar trwchar;

Alıntı:

>

Sizce wchar[] şeklinde tanımlayabilir miyiz?

Bizim türün dizisinde wchar[]'a otomatik dönüşüm olmadığını biliyorum.

Alıntı:

>
>     TT to(TT)()
>     {
>         return cast(TT)c_;
>     }
>
> ```

>
> Anlamadığım yerler var. 2 T ne işe yarıyor.(tahmin !wchar da işe yarıyor.)

Yapıyı tanımlarken kullanılan T ile karışmasın diye başka bir isim olarak seçtim. Yapı wchar ile kullanılmış bile olsa, to!dchar denebiliyor. Yani T yapının değişken türü, TT de to işlevinin...

Alıntı:
> Şuan yapmak istediklerimiz(Bence):
>
> 1.tr!(istediğimizTür)('s');
> 2.tr!(istediğimiztüründizgisi[])("deneme");
>
> Birincisini verdiğiniz kodlar hallediyor.Ama bana asıl sorun ikinci kodlar gibi geldi. Çünkü siz bu kodları vermeden öncede denemiştim ama pratik bir yolunu bulamadım.
>

Bence ikincisini D diline bırakabilmeliyiz. Yani trwchar[] yazılabilmeli; ama "deneme" gibi bir dizgiyle ilklenemiyor.

Ali

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

Elinize sağlık.

Ama hala '"Ali Çehreli & Walter Bright"' dizgisinde ne yapılacağı belirsiz değil mi ?

Ben bunun için yine '""' imini koymayı teklif ediyorum. (Bu hem trileri, hemde bu proje için geçerli.)

Örnek : '"Ali Çehreli & Walter Br\ight"'
toupper (yada toupper_tr) işlevini çağırdığımızda sonucuda şöyle bir şey olur:

'"ALİ ÇEHRELİ & WALTER BR''I''GHT"'
Sizce ?

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

« First   ‹ Prev
1 2