Jump to page: 1 2 3
Thread overview
February 18, 2010

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

Ali

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

July 09, 2010

Bir örnek deneyim dedim ancak hata verdi:

import std.cstream; //1.satır
void main()
{
   T giriştenOku(T)(string soru)
   {
       dout.writef(soru, ": ");

       T cevap;
       din.readf(&cevap);

       return cevap;
   }
   T giriştenOku(T : string )(string soru) //13.satır
   {
       dout.writef(soru, ": ");

       char[] cevap;
       din.readf(&cevap);

       return cevap.idup;
   }
}//22.satır

Ancak hata verdi :


isimsiz.d(13): found 'giriştenOku' when expecting ';' following statement
isimsiz.d(13): found ':' when expecting ')'
isimsiz.d(13): found 'string' when expecting ';' following statement
isimsiz.d(13): found ')' instead of statement
isimsiz.d(22): unrecognized declaration

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

July 09, 2010

Alıntı:

>

Şablon tanımlarının evrensel isim alanına çıkartılması gerek:

Şimdi denediğim kadarıyla Şablon tanımının evrensel isim alanına(Eğer işlev içinde olmazsa evrensel isim alanı mı deniyor?) çıkartılması gerekmiyor. Ancak eğer şablon özellemesi var ise (: karakteri içeren şablon demek istedim.) evrensel isim alanına çıkarılması gerekiyor. Benim denediğim kadarı ile böyle. Ancak neden şablon özellemesi var iken evrensel alana çıkarılması gerekiyor daha anlayabilmiş değilim.

Foruma sormalımıyız ? Şablon özellemeleri evrensel alanda mı olmalı ? Sadece normal şablon tanımlanması nerede olmalı ? Şuan ki davranış doğru mu diye ?

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

July 09, 2010

Şablon tanımlarının evrensel isim alanına çıkartılması gerek:

T giriştenOku(T)(string soru)
{
   // ...
}

T giriştenOku(T : string )(string soru)
{
   // ...
}

void main()
{
   // ...
}

Doğrusu, bunun şart mı olduğunu veya bir dmd garipliği mi olduğunu bilmiyorum ama bana böylesi zaten daha doğal geliyor.

Şimdi D2 kurallarına baktım. Şablon sayfasında böyle bir kısıtlamadan bahsedilmiyor.

Ama main bir işlev olduğuna göre, işlev kurallarına baktım:

http://digitalmars.com/d/2.0/function.html

İçlerinde BlockStatement bulunabiliyor.

BlockStatement'in tanımında da Statement'lar bulunabiliyor. Statement'ların içindeki NonEmptyStatement'lar arasında da şablon (template) bulunmuyor:

http://digitalmars.com/d/2.0/statement.html#NonEmptyStatement

Buna bakarak işlev içlerinde şablon tanımlanamayacağının bir kural olduğunu düşünebiliriz. Ama o da doğru değil, çünkü şablon özellemesini yazana kadar çalışıyor.

Şu da çalışıyor:

void main()
{
   class C(T)
   {}

   C!int c;
}

Gerçekten emin değilim; ama zaten evrensel alanda tanımlanmaları çok doğal geliyor.

Ali

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

July 09, 2010

Evet, "global namespace" yerine "evrensel isim alanı" dedim.

Sen sormak ister misin? İşlev içindeki şablon özellemesine "function-local template specialization" demeli.

Ayrıca, "template specialization" diye aratınca dmd'nin bir çok hatası var; bu bulduğun onlardan birisiyle ilgili olabilir:

http://d.puremagic.com/issues/buglist.cgi?quicksearch=template+specialization

Ali

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

July 13, 2010

Alıntı:

>

Sen sormak ister misin? İşlev içindeki şablon özellemesine "function-local template specialization" demeli.

Sormak isterim ancak ingilizce nasıl bir yazı yazmalıyım bilmiyorum.
Şöyle bir mesaj uygun olur mu ? (Özellikle ingilizce yönünden):

Konu : function-local template specialization

Mesaj :
Code :
import std.cstream; //1.line
void main()
{
T input(T)(string soru)
{
dout.writef(soru, ": ");

   T answer;
   din.readf(&answer);

   return answer;

}
T input(T : string )(string soru) //13.line
{
dout.writef(soru, ": ");

   char[] answer;
   din.readf(&answer);

   return answer.idup;

}
}//22.Line

Error code:
isimsiz.d(13): found 'input' when expecting ';' following statement
isimsiz.d(13): found ':' when expecting ')'
isimsiz.d(13): found 'string' when expecting ';' following statement
isimsiz.d(13): found ')' instead of statement
isimsiz.d(22): unrecognized declaration

Why does an error?

Why not give second example error if the problem is the global namespace?
Second example:
import std.cstream;
void main()
{
T input(T)(string soru)
{
dout.writef(soru, ": ");

   T answer;
   din.readf(&answer);

   return answer;

}
}

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

July 13, 2010

Alıntı:

>

Fazla karışmış oluyorum ama benim öneriler böyle... :/

Lütfen biraz daha karışın yoksa ingilizce olarak hiç bir derdimi anlatamayacağım. Ben ingilizce delete yerine ne kullanabilirim demeye çalışıyorum yanıt olarak ta delete güvensiz, gerçekten onu kullanmak istemezsin diye bir yanıt alıyorum.

Alıntı:

>

Senin ikinci örneğinde tanımlar evrensel alanda değildi ve özelleme unutulmuştu.)

Biliyorum. Şunu demeye çalıştım. Özelleme olmayınca evrensel alanda çalışmasada oluyor. Özelleme olunca neden olmuyor. Bu ne perhiz bu ne lahana turşusu demek istedim.

Şu halde mi yollayayım :
Konu : function-local template specialization

mesaj :

void main()
{
T input(T)()
{}

T input(T : string)()
{}
}

Error message :

isimsiz.d(6): found 'input' when expecting ';' following statement
isimsiz.d(6): found ':' when expecting ')'
isimsiz.d(6): found 'string' when expecting ';' following statement
isimsiz.d(6): found ')' instead of statement
isimsiz.d(8): unrecognized declaration

Shouldn't that work?"

And

void main()
{
void input(T)()
{}

void input(T : string)()
{}
}

Again, Shouldn't that work?"

Error message:
isimsiz.d(6): Error: declaration input(T : string) is already defined

there is no problem when the templates are in the global namespace. (Eğer küresel alanla ilgili sorun yok diyorsak nereden biliyoruz ? Belki küresel alanda sorun olması yanlış.)

Birde konuyu nerede açayım. D.Learn'de açarsam hata varsa hata olduğu anlaşılamaz bence.

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

July 13, 2010

Fazla karışmış oluyorum ama benim öneriler böyle... :/

Öneği iyice küçültebilirsin. Bu da aynı hatayı veriyor:

void main()
{
   T input(T)()
   {}

   T input(T : string)()
   {}
}

Ayrıca bir hata daha keşfettim. T döndürmek yerine void döndürünce hata farklı oluyor:

void main()
{
   void input(T)()
   {}

   void input(T : string)()
   {}
}

Bu durumdaki hata:

deneme.d(19540): Error: declaration input(T : string) is already defined

İngilizceler olarak da kısaca "Shouldn't that work?" (çalışması gerekmez mi?) denebilir. Ek olarak, "there is no problem when the templates are in the global namespace." dense yeter. (Senin ikinci örneğinde tanımlar evrensel alanda değildi ve özelleme unutulmuştu.)

Ali

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

July 13, 2010

Alıntı (canalpay):

>

Şu halde mi yollayayım :
Konu : function-local template specialization

O başlığın sonuna bir de "error" yakışır. :)

Alıntı:

>

mesaj :

void main()
{
T input(T)()
{}

T input(T : string)()
{}

}

Error message :

isimsiz.d(6): found 'input' when expecting ';' following statement
isimsiz.d(6): found ':' when expecting ')'
isimsiz.d(6): found 'string' when expecting ';' following statement
isimsiz.d(6): found ')' instead of statement
isimsiz.d(8): unrecognized declaration

Shouldn't that work?"

And

void main()
{
void input(T)()
{}

void input(T : string)()
{}

}

Again, Shouldn't that work?"

Sonlarında çift tırnak kalmış.

Alıntı:

>

Error message:
isimsiz.d(6): Error: declaration input(T : string) is already defined

there is no problem when the templates are in the global namespace. (Eğer küresel alanla ilgili sorun yok diyorsak nereden biliyoruz ? Belki küresel alanda sorun olması yanlış.)

Özelleme olanağı diye bir şey var ve evrensel alanda çalışıyor (ben denedim :)). Zaten beklenen de o. Soru şu: özellemenin bir işlev içindeyken çalışmıyor olması bir hata mı, yoksa zaten işlev içindeki özellemeler desteklenmiyor mu?

Bana sorarsan bir derleyici hatası; ve onlar da zaten "lütfen bir bug report aç" diyecekler.

Alıntı:

>

Birde konuyu nerede açayım. D.Learn'de açarsam hata varsa hata olduğu anlaşılamaz bence.

Bence orası uygundur. Steven Schveighoffer orayı izliyor. Ama D grubu da olur.

Ali

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

July 14, 2010

Alıntı (canalpay):

>

Bunu nerede istiyeceğim ? Daha doğrusu Andrei beni takar mı nereye yazsam takar?

Son cümle çok güzel.canalpay,herhangi bir resmi foruma yazarsan takar.Zaten takmak zorunda.D dilini milyarlarca insan bilmiyor.Bilenler ise dili oluşturanlar için çok önemlidir.Sen yaz,takmazlarsa bastırırız.

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

« First   ‹ Prev
1 2 3