August 08, 2012

Alıntı (Salih Dinçer):

>

İlkinde bir delegate kurmuş ve int türünde işlev döndürmek istemiş. Ama bunu ters yapmış yani return'ü başta kullanacağına with'den hemen sonra icra etmiş.

Eğer D'nin kuralı senin söylediğin gibi olması gerektiğini söylüyorsa haklısın. Ama öyle demiyorsa veya dese bile kodu yasalmış gibi kabul ediyorsa bir yerde bir hata var demektir.

Alıntı:

>

ikinci örnekte de with'den sonra if kullanmış! Sanki birbirlerine benziyor ve küme parantezlerinden önce deyim girmiş gibi görünüyorlar.

O konuyu da iyice açıklamaları gerek. with'in her zaman için küme parantezi ile kullanılması gerekiyorsa ya kod derlenmemeli ya da küme parantezi kullanıp kullanmamak bir fark doğurmamalı.

Ali

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

August 09, 2012

Alıntı (acehreli:1344440099):

>

Eğer D'nin kuralı senin söylediğin gibi olması gerektiğini söylüyorsa haklısın. Ama öyle demiyorsa veya dese bile kodu yasalmış gibi kabul ediyorsa bir yerde bir hata var demektir.
Evet, gerçekten de bir hata var gözüküyor. Hata raporunu tekrar açmışlar ve ben de kabül etmek zorunda kaldım...:)

Çünkü şunları denedim:
Alıntı:

>

Alıntı (Sample-1):

>
> > void main()
> > {
> >     Enum en;
> >
> >     with (Enum)  // <-- ERROR: found '}' instead of statement
> >
> > }
> > ```

>
> Düşündüm ki if() gibi with() de parantezsiz kullanıma izin verebilir...
>
> Alıntı (Sample-2):
> >
> >

void main()
{
Enum en;

with (Enum); // <-- ERROR: use '{ }' for an empty statement, not a ';'

}

>

Ancak bir semicolon olmak zorundadır ve tek başına olduğunda küme parantezleri kullanılmalıdır. O yüzden D yukarıdaki kod parçacığına da izin vermez...

Alıntı (Surprised):

>
> > void main()
> > {
> >     Enum en;
> >
> >     with (Enum) // <-- NO ERROR!
> >     if(true) en1.writeln;
> > }
> > ```

> Ancak biz bunu bir if() ile sonlandırırız ve de çalıştığınız görürüz...:)
>

Böyle sürprizler ile karşılaşınca with()'e güvenim sarsılıyor. En iyisi dikkatli kullanmalı...

Alıntı:
> O konuyu da iyice açıklamaları gerek. with'in her zaman için küme parantezi ile kullanılması gerekiyorsa ya kod derlenmemeli ya da küme parantezi kullanıp kullanmamak bir fark doğurmamalı.

Meğer hata burada değilmiş; küme parantezi olmadan da çalışabilen bir kodu başka şekillerde de çalışabilmesiymiş. Öyleyse son kod parçacığının çalışması bizi linker hatasına götürüyor. Öyle değil mi?

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

Örneklere geçmeden önce with'in D dilindeki tanımına bakalım:

http://dlang.org/statement.html#WithStatement

Üç geçerli kullanımı varmış:

  • with ( Expression ) ScopeStatement

  • with ( Symbol ) ScopeStatement

  • with ( TemplateInstance ) ScopeStatement

Parantez içine gelenleri bir kenara bırakalım çünkü hepsinde de with'den sonra ScopeStatement geliyor. Onun tanımına geçiyorum:

http://dlang.org/statement.html#ScopeStatement

  • NonEmptyStatement

  • BlockStatement

Önce NonEmptyStatement'a bakalım:

  • NonEmptyStatementNoCaseNoDefault

  • CaseStatement

  • CaseRangeStatement

  • DefaultStatement

Bunlar arasından birincisinin tanımı çok kalabalık ama senin örneğindeki if'li kullanımı kapsıyor:

import std.stdio;

enum Enum { en1 }

@property void writeln(Enum e)
{
   std.stdio.writeln(e);
}

void main()
{
   Enum en;

   with (Enum) // <-- NO ERROR!
       if(true) en1.writeln;
}

O tamam. Dilin yazım kurallarına uyuyor. Öte yandan tek noktalı virgül yasal değil çünkü dilin yazım kurallarında geçmiyor. Aynı biçimde with()'den sonra hiçbir şey gelmemesi de yasal değil çünkü o durum da dilin yazım kurallarında listelenmemiş.

Alıntı (Salih Dinçer):

>

Böyle sürprizler ile karşılaşınca with()'e güvenim sarsılıyor. En iyisi dikkatli kullanmalı...

Programcılık zor iş; hep dikkatli olmalıyız :) ama bu konudaki sürpriz, beklentilerimizin dilin kuralları dışında kalmasından kaynaklanıyor.

Bu incelemeyi tamamlamak için with'in altına gelebilecek bir de BlockStatement'a bakalım:

http://dlang.org/statement.html#BlockStatement

Onun her iki seçeneği de küme parantezlerini gerektiriyor:

  • { }
  • { StatementList }

Ali

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

1 2
Next ›   Last »