Thread overview
Varsayılan parametre değeri olarak LINE ve arkadaşları
Mar 13, 2015
Salih Dinçer
May 03, 2015
huseyin
May 04, 2015
huseyin
January 12, 2015

LINE, FILE, FUNCTION, PRETTY_FUNCTION, ve MODULE özel anahtar sözcükleri varsayılan parametre değeri olarak kullanıldıklarında çağrıldıkları yerdeki değeri alırlar.

Ben bunun yalnızca şablon parametreleri için doğru olduğunu sanıyordum:

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

Normal işlevler için de geçerliymiş:

import std.stdio;

void foo(size_t satır = __LINE__)
{
   writefln("foo içindeki satır      :%3s", __LINE__);
   writefln("çağrıldığı yerdeki satır:%3s", satır);
}

void main()
{
   foo();
}

Çıktısı:
'
foo içindeki satır : 5
çağrıldığı yerdeki satır: 11
'
Kitabı daha sonra düzelteceğim.

Ali

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

March 13, 2015

Bu olanağın ne işe yarayabileceğini düşünüyorum...

Sonuçta bunlar da derleme anında, tıpkı şablonlarda olduğu gibi katıştılmış bir şekilde üretiliyor. Eğer bir takım sorgu ve uyarı sistemleri için kullanılırsa, derleyici tüm kodu okuyup bizim için bu değerleri sabit (constant) olarak istediğimiz yere yerleştirecek. Ya sonra?

Örneğin...

  • Geniş bir sınıf, geliştirme aşamasında tüm üye işlevleri önceden belirlenip (Vizyoner Yaklaşım FÇB: Faydalı Çerçeve Belirleme) yazılmaya başlandıysa, satır sayısı az olanlar çalışma anında bir uyarı verip aslında işlevin döndürdüğü değerin hesaplanmadığını bildiribilir. Yani sadece üye işlevin yeri geçici olarak doldurulduğunu biliriz.
  • Hatta bu uyarı sistemi kendi kendini imha edebilir. Satır sayısı belli bir seviyeye çıktığında (örn. kodlama alışkanlığına göre değişmekle birlikte 4-5 satırdan fazlaysa) artık yeni eklenen kodların değerini döndürür.
  • Bu sistem, bu şekilde etkin değil de arkaplanda çalışan pasif bir loglama sistemi (tracer), çok basit olarak mümkün görünüyor. Öyle ki çağrılan işlevlerin isimleri ile birlikte modül ve satır numaraları (örn. bir dosyada) biriktirebilir.

Tam olarak bu maddeyi yazarken bir şeyin farkına vardım. Zaten bu parametreler, hali hazırda derleme anında çıkan hata ve uyarılarda kullanılıyor olmalı. Bu yüzden, derleyicinin bizimle bu sabitleri paylaşması çok güzel bi'şiii :)

Tabi olası hataları en aza indirmek için (Zafer Çelenk'in kulakları çınlasın) etkili mekanizmalarımız vardı diye hatırlıyorum. Zafer'in TÜDEV 2012 seminerinde anlattığı in/out blokları da çok işimize yarayabilir.

Bilmiyorum, bu sabitler başka ne işimize yarardı?

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

March 14, 2015

Alıntı (Salih Dinçer):

>

Zaten bu parametreler, hali hazırda derleme anında çıkan hata ve uyarılarda kullanılıyor olmalı. Bu yüzden, derleyicinin bizimle bu sabitleri paylaşması çok güzel bi'şiii :)

Aynen öyle. :) Bunlar C (ve C++) makrolarında da yararlıdır. (D'de makro yok ama benzer olarak mixin var.) C'de makro ile eklenen kod içindeki değişken isimlerin çakışmamaları (aynı olmamaları) istendiğinde örneğin, LINE değerinden yararlanılır.

Benzer durumu D'de ama uyduruk :) bir örnekle göstermek istersek:

string değişkenTanımı()
{
   return "int i = 42;";
}

void main()
{
   mixin (değişkenTanımı());
   mixin (değişkenTanımı());    // DERLEME HATASI
}

'i' isminde iki değişken olduğu için derleme hatası:

'Error: declaration deneme.main.i is already defined'

Bir çözüm, LINE'dan yararlanmak:

string değişkenTanımı(size_t satır = __LINE__)
{
   import std.string;
   return format("int i_%s = 42;", satır);    // <-- İsmi i_N gibi...
}

Artık derlenir çünkü iki değişkenin adları artık örneğin 'i_1000' ve 'i_1001'dir. (Tabii bu uyduruk bir örnek; o isimlerin bilinmeleri gereken durumlarda işe yaramaz. Daha güzel örnekler için C'ye bakmak gerek...)

Ali

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

May 03, 2015

Alıntı:

>
> void main()
> {
>     mixin (değişkenTanımı());
>     mixin (değişkenTanımı());    // DERLEME HATASI
> }
> ```

>

D'nin mixin adlı özelliğinin yapısını düşünüyorum fakat işin içinden çıkamadım doğrusu. Bir bilene danışalım dedim nasıl yapıyor bunu?

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

mixin aslında çok basit: Kendisine verilen dizgiyi bulunduğu noktaya kodmuş gibi yerleştiriyor. Derleyici önce mixin'in değerini yerleştiriyor, sonra derlemeye geçiyor.

Buradaki asıl önemli olan özellik, D'nin derleme zamanında işlev işletebilmesi (CTFE). mixin'ler o zaman daha güçlü hale geliyorlar. Yukarıdaki değişkenTanımı() gibi basit dizgiler yerine olabildiğince karmaşık kodlar üretmek ve mixin ile yerleştirmek çok kolay.

Ali

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

May 04, 2015

Alıntı:

>

Buradaki asıl önemli olan özellik, D'nin derleme zamanında işlev işletebilmesi (CTFE).

Anlıyorum yorumlayarak derliyorlar. Gerçekten içinden çıkamadığım bir durum benim bu belki de bakış açımı değiştirmeliyim değil mi :) Programlama dili geliştirmek gerçek bir üstadlık işi bunu anladım. D'yi de gerçek üstadlar geliştiriyor kim ne derse desin bence geleceği değiştirecek dillerden birisi olacak

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

May 04, 2015

Alıntı (huseyin):

>

Anlıyorum yorumlayarak derliyorlar.

Eğer yorumlamalı dillerin yaptığı gibi düşünüyorsak tam doğru değil çünkü gerçek anlamda derliyor. Şöyle bir kod olsun:

import std.stdio;
import std.format;

string toplamaİfadesi(string birinci, string ikinci)
{
   return format("%s + %s", birinci, ikinci);
}

unittest
{
   assert(toplamaİfadesi("elma", "armut") == "elma + armut");
}

void main()
{
   int a = 1;
   int b = 2;

   int c = mixin(toplamaİfadesi("a", "b"));

   writeln(c);
}

Derleyici main işlevini derlerken bir mixin'le karşılaşıyor. Koda ne katacağını bilmesi için mixin'in içindeki ifadeyi işletmesi gerekir.

toplamaİfadesi()'ni "a" ve "b" ile çağırabilmesi için toplamaİfadesi'nin derlenmiş olması gerekir. (Belki daha önceki bir mixin veya şablon tarafından da gerekmiştir ve o yüzden zaten derlenmiştir. Veya, bu ilk ihtiyaçtır ve o yüzden daha derlenmemiştir.)

toplamaİfadesi derleniyor, derlenmiş olan işlev çağrılıyor ve o "a + b" dizgisini döndürüyor.

mixin'e verilen o dizgi main'e katılınca işlev şu hale geliyor:

   int a = 1;
   int b = 2;

   int c = a + b;

   writeln(c);

Derleyici şimdi de o kodu derliyor. Yani, aslında karmaşık bir konu değil: Derlerken gereken başka kodla karşılaşınca önce o kodu derliyor.

Ali

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