Thread overview
D geliştiricileri için bir kaç husus/soru
Feb 09, 2013
Salih Dinçer
Feb 09, 2013
Salih Dinçer
Feb 18, 2013
Salih Dinçer
February 09, 2013

Merhaba,

Bir süredir; D üzerine program geliştiriyorum. Bir kaç küçük soru biriktirdim. Bu belki genel programlama ile de alakalı olabilir. Ancak kesinlikle cevaplarını D çerçevesinde beklemekteyim!

(ukala sincap seni...:D)

Göz korkutmamak için adım adım gitmek istiyorum. Örneğin özelleştirilmiş kütüphanelerden bahsedelim. Yılbaşından beri kendi kütüphanemi toplamaya çalışıyorum. Kütüphane dediğime bakmayın, sağda solda parça halindeki küçük kodları, bir düzen halinde sdb.xyz sınıfı olarak toparlıyorum. İlk işim algorithm ve math gibi şeyler. Ancak büyük bir sıkıntım var:

public import olayını biliyorum ama her seferinde kodumu derlerken tüm kullanılan modülleri, bulunduğu yeri, derleme parametresi olarak vermem gerekiyor! Bunun önüne geçmenin bir yolu var mı? Örneğin sdb kütüphanesini phobos'a ait olmadığı halde içine mi yerleştirsem? Çünkü derleyici ilk oraya (src, phobos dizinleri) baktığını biliyorum...

Yoksa derleyicinin bir configuration dosyası var mı?

Şimdilik bu kadar, teşekkürler...

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

February 09, 2013

Çok teşekkürler Ali hocam ama beceremedim galiba...:)

Bende ki /etc/dmd.conf dosyasının içeriği şöyle:
';
; dmd.conf file for dmd
;
; dmd will look for dmd.conf in the following sequence of directories:
; - current working directory
; - directory specified by the HOME environment variable
; - directory dmd resides in
; - /etc directory
;
; Names enclosed by %% are searched for in the existing environment and inserted
;
; The special name %@P% is replaced with the path to this file
;

[Environment]

DFLAGS=-I/usr/include/d/dmd/phobos -I/usr/include/d/dmd/druntime/import -L-L/usr/lib64 -L-L/usr/lib -L--no-warn-search-mismatch -L--export-dynamic'

Buradaki DFLAGS= eşitliğinden sonra, şu yolu bayrağı ile bitişik şekilde ekledim:

'-I/home/atelyeweb/Projeler'

İçinde sdb dizini ve sınıflarım var ama derleme esnasında yine şu hataları alıyorum:

'tabanAritmetik.o: In function _D14tabanAritmetik6Dünya6__ctorMFZC14tabanAritmetik6Dünya': tabanAritmetik.d:(.text._D14tabanAritmetik6Dünya6__ctorMFZC14tabanAritmetik6Dünya+0x28): undefined reference to _D3sdb9algorithm9Base32v656__ctorMFAyaZS3sdb9algorithm9Base32v65'
tabanAritmetik.o: In function _D14tabanAritmetik4Atom2idMFNdZAya': tabanAritmetik.d:(.text._D14tabanAritmetik4Atom2idMFNdZAya+0x45): undefined reference to _D3sdb9algorithm9Base32v656encodeMFNdmZAya'
tabanAritmetik.o: In function _Dmain': tabanAritmetik.d:(.text._Dmain+0x46): undefined reference to _D3sdb9algorithm9Base32v656__ctorMFAyaZS3sdb9algorithm9Base32v65'
tabanAritmetik.d:(.text._Dmain+0x5d): undefined reference to _D3sdb9algorithm9Base32v656encodeMFNdmZAya' tabanAritmetik.d:(.text._Dmain+0x8d): undefined reference to _D3sdb9algorithm9Base32v656decodeMFNdAyaZm'
collect2: hata: ld çıkış durumu 1 ile döndü
--- errorlevel 1
'
Hatta -I parametresini (L değil büyük I harfi) yol ile birlikte elle de girmeyi denedim, belki sistem boot olduğunda bu bilgiler hafızaya yükleniyor olabilir dedim ama değişen bir şey olmadı...:(

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

February 09, 2013

Var: dmd.conf

Eğer dmd sisteme kurulmuşsa örneğin /etc klasörüne kopyalanıyor. Eğer zip dosyasından açılmışsa açıldığı yerde duruyor.

Kurulan dmd /etc'dekini kullanıyor, açılan dmd kendisi ile ilişkili olanı kullanıyor. En azından öyle olması gerekiyor ama bu konuda karışıklık yaşayan programcılar oluyor. Farkında olmadan sistemdeki başka bir dmd.conf'u kullanıyorlar.

http://dlang.org/dmd-linux.html#dmd_conf

O dosyadaki satıra herhalde -I seçeneğini eklemen gerekecek.

Ali

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

February 09, 2013

'-I', import edilen modüllerin nerede olduklarını bildiriyor. O modüller yine de ayrıca derlenmeleri ve programa bağlanmaları gerek. En kolayı, bütün ilgili modülleri aynı satıra yazmak:

'dmd deneme.d kullandigim_modul.d ...'

İstersen o modülleri kütüphane haline getirdikten sonra da bağlayabilirsin:

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

Ali

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

February 18, 2013

Benim, bir de en çok kafamı karıştıran soru en sık kullandıklarımdan:

alias this (http://ddili.org/ders/d/alias_this.html) ile ilgili...

Sanırım yakında, eşittir (=) işareti ile birlikte kullanmak gerekecek? Peki tam olarak değişen kısaca nedir? Yani this eskiden sondaydı şimdi ortada mı?

Şöyle bir rakamları sayan yapımız olsun:

struct Rakamlar {
 int rakam;

 alias front this;  /* <-- DMD 2.6x'den öncesi
 alias this = front; //*     için satırı açın */

 int front() const  {      return rakam;      }
 void popFront()    {      rakam++;           }

 int back() const   {      return rakam - 1;  }
 void popBack()     {      rakam--;           }

 bool empty() const {
   return (std.math.abs(rakam) == 10);
 }
}

Biz bunu, eskiden gizlenen satırdaki gibi kullanıyorduk öyle değil mi? Peki sınıfı kullanırken değişen bir şey var mı? Örneğin ekrana yazdırdığımızı ve son elemanın değerini öğrendiğimiz farz edelim:

import std.stdio;

void main() {
  auto pozitifRakamlar = Rakamlar(1);

  assert (pozitifRakamlar == 1);
  foreach(rakam; pozitifRakamlar) rakam.write(",");

  putchar(8);   // bitecekse imleçi sola kaydır...
  writeln(" "); // sondaki virgülü silip satır başı yapar!
}/*
1,2,3,4,5,6,7,8,9
*/

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

February 18, 2013

Hem 'alias''ın hem de 'alias this''in söz dizimleri daha doğal hale getirildi. İşlevinde hiçbir değişiklik olmadı.

Bu, 'alias''ın C'deki eşdeğeri olan 'typedef''in de çok eleştirildiği bir konudur. Doğal olan, tanımlanan şeyin isminin önce gelmesidir ama 'typedef''de tersidir:

typedef int Sicaklik;

(Tabii onu savunanlar da değişken tanımlamaya benzediğini söylerler: Asıl tür solda, tanımlanan şey sağda...)

D'ciler eleştirileri kabul ettiler ve şöyle değiştirdiler:

alias Sıcaklık = int;    // Artık Sıcaklık int'in eşdeğeri
alias this = birÜye;     // Bu nesne artık birÜye()'nin türünün yerine kulllanılabilir

Verdiğin örnekteki kullanımın anlamı şu: front()'un türü ne ise (tabii int olduğu açık), bir Rakamlar nesnesi o türün yerine kullanılmak istendiğinde otomatik olarak front()'u çağır ve onun döndürdüğü sonucu kullan. Bu da otomatik tür dönüşümünden başka bir şey değil: Rakamlar nesnesi otomatik olarak int türüne dönüştürülüyor.

Ayrıca, bu aralık ilginç olmuş. front()'unun değeri 3 iken back()'inin değeri 2. Yani, baştan sona doğru ilerleme kavramı için garip.

Tabii bunu yalnızca denemek için yapıyorsun ama bütün aralığın tek elemanı yerine kullanılabilmesinin sorunları olacaktır. Bunu senin son üç satırını teke indirmeye çalışırken kendim yaşadım: writefln, pozitifRakamlar'ın bir int aralığı mı yoksa tek int mi olduğunu bilemiyor:

  writefln("%(%s,%)", pozitifRakamlar);

Yoksa, yukarıdaki satır da seninkiyle aynı çıktıyı üretecektir.

Ali

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