Jump to page: 1 2 3
Thread overview
January 29, 2013

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

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

January 29, 2013

C dilini bilmiyorum ancak sorduğun yeni ad tanımlama ise şöyle yapılabilir

alias intgibiEskiad yeniad;

yada


alias yeniad = esliad;

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

January 29, 2013

Ö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:

Alıntı:

>

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.)

Alıntı:

>

Alıntı:

>

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

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

January 29, 2013

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

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

January 29, 2013

Alıntı:

>

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.

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

January 29, 2013

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.

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

January 29, 2013

Alıntı:

>

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.

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

January 29, 2013

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..

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

January 29, 2013

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

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

January 29, 2013

Alıntı:

>

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

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

« First   ‹ Prev
1 2 3