Forum: D Programlama Dili RSS
C dilindeki gibi define
Sayfa:  1  2  sonraki 
Avatar
zekeriyadurmus #1
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C dilindeki gibi define
Merhaba yine ben ve ilginç bir istekle karşınızdayım :)

C dilindeki define özelliği D dilinde de var mı? Yoksa eğer Walter abimizin böyle bir düşüncesi var mı?

Zekeriya
Bilgi meraktan gelir...
canalpay (Moderatör) #2
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
C dilini bilmiyorum ancak sorduğun yeni ad tanımlama ise şöyle yapılabilir

alias intgibiEskiad yeniad;

yada
 
alias yeniad = esliad;
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Öncelikle olmadığını belirteyim ama onun yerine son derece gelişmiş bir şablon mimarisi var...

Ali hocamın bu konuda, forumdaki bir kaç cevabını nakledeyim:

Makroların sıkıntılı ve sorunlu oldukları konusunda şüphe yok. Olabilse, hiç makro kullanılmasın ama bazen mecbur kalınır. (Bjarne Stroustrup C++'tan çıkartmaya çalışmıştır ama bazı durumlarda şarttır.)


Konuyu dağıtıyorum ama daha geçende TDPL'de anlamını bilmediğim 'macro' anahtar sözcüğüne rastladım. Hiçbir açıklama verilmeden listelenmişti. 'macro' Can'ın gösterdiği sayfada ve şurada da geçiyor:

  http://dlang.org/lex.html

Anlamını sordum:

  http://forum.dlang.org/post/jsd9us$2fob$1@digitalmars.com

Ali
'macro' şimdilik kullanılmıyormuş. İlerisi için ve olasılıkla "AST macros" olanağı için ayrılmış bir sözcükmüş.

ve AST makroları geçen/açıklanan bir başlık: http://ddili.org/forum/post/3023
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #4
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
C dilini bende bilmiyorum :P ama gördüğüm örneklerde anladığım kadarıyla compile time çalışıyor ve

#define NEXT()    __asm__("jmp *%0"::"r"((++ip)->jmp)); goto *ip->jmp

şeklindeki bir define next() gördüğü yere __asm şeklinde devam eden kodu yazıyor. Her yere bunu yazmak yerine sadece next() yazmak yeterli oluyor. Aynı şekilde D dilinde bu işlem yapılabilir mi?

Şablonlar ile hiç uğraşmadım :( pek bir bilgim yok malesef.

Zekeriya
Bilgi meraktan gelir...
canalpay (Moderatör) #5
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
alias yeniad = esliad;

Bu kullanım henüz desteklenmiyormuş.

Anladığım kadarıyla define tür tanımlamaktan daha fazlası imiş.


Bunun için Salih Dinçer'in bahsettiği şablon olanağı zaten buna ihtiyaç bırakmıyacaktır. Belki bazı durumlarda mixinde kullanabiliriz.
import std.stdio;
  
enum a = q{writeln("deneme"); int i = 42;};
 
void main()
{
       mixin(a);writeln(i);
}
Bazı gereken yerlerde lambda kullanılabilir? Bunun direk karşılığı D'de yok bildiğim kadarıyla.
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
mixin()'i şablonlarda da kullanıyoruz ama bu daha farklı bir olay arkadaşalar...

Bir makro düşünün ki dışarıdan parametre alsın. Tüm argümanları makro içine yerleştirip sonsuz olasılıktaki kodu üretsin. Sonra derlerken bunu çağrıldığı yerdeymiş gibi varsaysın.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
canalpay (Moderatör) #7
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #5
ama gördüğüm örneklerde anladığım kadarıyla compile time çalışıyor ve


Şablonlarda mixinde derleme zamanı çalışır.

mixin kısaca parametrede verilen kodu derleme zamanında oraya ekler.

Örneğin mixin için şu iki kodun asm olarak farkı olmasa gerek(enum stringden farklı olarak referans değil değer türüymüş? Yinede fark olmasa gerek.):

import std.stdio;
  
enum a = q{writeln("deneme"); int i = 42;};
 
void main()
{
       mixin(a);writeln(i);
}

ile
import std.stdio;
 
void main()
{
      writeln("deneme"); int i = 42;writeln(i);
}

aynı asm kodu üretmesi gerekiyor. Derleme zamanı.

Şablon ise kısaca gereksiz yere overload(aşırı yükleme) yapmayı engellemek için kullanılan bir olanak. Şurada çok basit Ali Bey anlatmıştı: http://ddili.org/forum/thread/82  Ayrıntı için dershaneye bakabilirsin.


Şuan google'dan araştırırken bir şeyler buldum: http://dlang.org/mixin.html  //Buradaki örnekte şablon CTFE için yanı derleme zamanında işlev işletebilmek için kullanılmış.

Orada ayrıca bu var :http://dlang.org/template-mixin.html

Kısaca hangi amaçla kullandığına göre değişik zamanlarda değişik şeyler kullanılabilir. Ali bey burada özellikle mixinin D'deki gibi şablon şeklinde kullanımını göstermiş.

Ancak şablon öğrenmen şart. Çünkü şablon hem senin istediğin gibi her şeyi derleme zamanı sunuyor. Hem de
kod yazımını çok kolaylaştırıyor.
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #6
Evet, şablon ve mixin kullanılabilir ama galiba asm blokları içinde 'opcode'dan başka bir şeye izin verilmiyor. (?)

Soruyu genel olarak şöyle yanıtlayabiliriz: C'nin makroları bütünüyle önişlemci olanağıdır. Kod derlenmeye başlanmadan önce önişlemci bütün makroların yerine metin karşılıklarını yerleştirir.

O açıdan bakınca önişlemcisi olmadığı için #define'ın D'de tam karşılığı yok ama kullanım amaçlarına bakınca hemen hemen hepsi var.

Ali
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu durumda pekala kendimiz bir önişlemci yazabiliriz. Tek yapması gerek derlenecek dosyayı alıp makrolar için gereken işlemi yaptıktan sonra oluşturacağı geçici dosyayı DMD'ye verir ve o da işini bitirdikten sonra dosyayı siler..
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #10
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #8
Açıkçası define özelliğini aşağıdaki kod üzerinde kullanmak istiyordum.

module main;
 
import std.stdio,std.datetime;
 
 
int main(string[] argv)
{
    OP[] Memory;
    Memory ~= OP(OPcodes.var,0);
    Memory ~= OP(OPcodes.var,1000000);
    Memory ~= OP(OPcodes.cmp,0,1);
    Memory ~= OP(OPcodes.inc,0);
    Memory ~= OP(OPcodes.jne,2);
    Memory ~= OP(OPcodes.hlt);
 
    auto mp = &Memory[0];
    int cmp,mc;
 
 
    auto currentTime = Clock.currTime();
    goto start2;
start:
    mc++;
start2:
    final switch((*(mp+mc)).Code){
        case OPcodes.cmp:
            cmp = (mp + (*(mp+mc)).P1 ).P1 - (mp + (*(mp+mc)).P2 ).P1;
            goto start;
        case OPcodes.inc:
            (mp + (*(mp+mc)).P1 ).P1++;
            goto start;
        case OPcodes.jne:
            if(cmp != 0){
                mc = (*(mp+mc)).P1;
                goto start2;
            }else goto start;
        case OPcodes.je:
            if(cmp == 0){
                mc = (*(mp+mc)).P1;
                goto start2;
            }else goto start;
        case OPcodes.hlt:
            goto end;
        case OPcodes.mov, OPcodes.lbl, OPcodes.var:
            goto start;
    }
end:
    auto currentTime1 = Clock.currTime();
    writeln(currentTime1 - currentTime);
    while(1){}
    return 0;
}
 
enum OPcodes
{
    var,mov,cmp,jne,je,hlt,lbl,inc
}
 
struct OP
{
    OPcodes Code;
    int P1;
    int P2;
}

araya asm kodları, d kodları vs girecek ve bu yüzden çok kod kalabalığı olacak.

Mixin yapısını inceledim biraz ama ya ben yapamadım ya da benim durumum için uygun değil.

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #11
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #9
Bu durumda pekala kendimiz bir önişlemci yazabiliriz. Tek yapması gerek derlenecek dosyayı alıp makrolar için gereken işlemi yaptıktan sonra oluşturacağı geçici dosyayı DMD'ye verir ve o da işini bitirdikten sonra dosyayı siler..

Çok mantıklı çok doğru söylediniz :D Eğer olmazsa bunu yaparım, eğer yaparsam paylaşırım forumda.

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Tabii bu iş için gcc ile gelen önişlemciyi de kullanabiliriz. Onun adı cpp (C++ ile karışmasın; ilgisi yok! :)).

Utana sıkıla :) şöyle bir kod yazın. İsmi bu denemede preprocess.d olsun:
import std.stdio;
 
#define ABC 10
 
#define HESAPLA(x, y) ((x) + (y)*3)
 
void main()
{
    writeln(ABC);
    writeln(HESAPLA(2, 3));
}

Sonra onu cpp'den (ve onun eklediği # satırlarından kurtulmak için sed'den) geçirin ve sonucu preprocess.out.d dosyasına yazın:

$ cpp preprocess.d | sed '/^\#/d' > preprocess.out.d

Sonuçta elde edilen preprocess.out.d dosyası dmd'ye derlemesi için vereceğimiz kaynak dosya olacak:
import std.stdio;
 
 
 
 
void main()
{
    writeln(10);
    writeln(((2) + (3)*3));
}

Ali
Avatar
Salih Dinçer #13
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu durumda Racih'in derle'sine uygulanabilir:

Gerçi "regular expression" kullanarak pekala bunu D içinde de yapabilir ve Sezar'ın hakkını Sezar'a vermiş oluruz...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #14
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali hocam bu cpp programını gcc kullanmadan kullanabilme imkanımız var mı?

Racih'in projesini inceledim gayet hoş güzel. Dediğiniz gibi uygulanabilir ama kafama takılan bir soru oldu.

Derleme esnasındaki oluşacak hataları görme konusunda sıkıntı çıkartmasın?

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #15
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
cpp'yi gerektirmeyen bir çözüm bulmalı... D.learn haber grubunda sordum. Bakalım başkaları ne yapıyor.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  sonraki 
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 04:07:20 (UTC -08:00)