Jump to page: 1 2
Thread overview
February 22, 2013
enum DT : int {//türlerin saklandığı enum
	STRING, INT
}
struct DataType{

}
struct var{//değişkenkerle ilgili bilgilerin saklandığı yer
	DT typ;
	void* val;
}
DataType[] datatypes;
var[] stack;
string str1 = "deneme";
string str2 = "deneme2";
stack~= var(DT.STRING, &str1);
stack~= var(DT.STRING, &str2);
//Üst kısım sadece tanımlama gerekli komut çağırıldığında aşağıdaki kodlar çalışacak.
op_cmp:
bool eşit_mi = DataType[stack[$-2].typ].karşılaştır(stack[$-2], stack[$-1]);
/*
Burada yapılacak olan işlem karşılaştırma operandına gelindiğinde stackdan son 2 veriyi çekip 1 değişkenin türüne ait işlevi çalıştırmak.
*/

Benim şimdi burada istediğim şey sınıfları kullanmadan her bir türe ait karşılaştır işlevi gibi işlevleri oluşturmak. Yani bunları depolamak.

Bunu şu şekilde sınıflarla yapabilirdik. RhS 1.0 da olduğu gibi bir Command[] dizisi oluşturabilirdik. Ama class dan daha iyi bir yapı olması gerekiyor.

class Command{
	bool eşitmi(var p1, var p2){
		return false;
	}
}
class RhString: Command{
	override bool eşitmi(var p1, var p2){
		return true;
	}
}

Konuya ne isim koyacağımı dahi bulamadım :(

Sorunumu tam anlatamamış olabilirim özür dilerim.

Zekeriya

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

February 22, 2013

Ve şunu da düşünmeden edemiyorum

İşlev çağırmak yerine asm ile call yaparak daha hızlı bir yapı oluşturulabilir mi?

Zekeriya

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

February 22, 2013
struct DataType{
	bool function(var, var) isEqual;
}

Ne kadar doğru bilmiyorum ama bu şekilde struct içerisinde işlevleri listelemeyi düşündüm. Kodların son halini githuba attım.

https://github.com/Rhodeus/Script2.0/blob/master/vm.d

Kodlar biraz karışık ama düzelir zamanla inşAllah.

Zekeriya

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

February 22, 2013

Sanırım bu durum 'std.variant'da var. Belki 'var' içinde variant türü kullanıp gerekli kurulumları, kuralları uygun yaptıktan sonra, kendi karşılaştırma yüklemesi içinde 'bool' değeri döndürebileceğini düşünüyorum. Şu variant modülünü hatim etme zamanı geldi...:)

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

February 22, 2013

Ayrıca yeni aklıma geldi, şunu denedin mi?
http://dlang.org/phobos/std_algorithm.html#equal

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

February 22, 2013

Salih hocam Variant yapısını RhS nin D deki ilk sürümünde kullandım oldukça yavaş bir yapı. Daha iyi bir yapıya ihtiyaç var :) Şimdi birkaç şey daha yaptım. Türlerle ilgili sorunu aşmış oldum sanırım.

Alıntı:

>

Ayrıca yeni aklıma geldi, şunu denedin mi?

Hayır denemedim. Şu anda direk karşılaştırma yapabiliyorum.

bool isEqual(var p1, var p2){
	if(p1.typ == p2.typ && *cast(string*) p1.val == *cast(string*) p2.val)
		return true;
	return false;
}

Burada çağırılan isEqual RhString veri türünün işlevi o yüzden işlenecek verinin türünü de biliyor. Verileri void* ile saklıyorum ve işlemi yapacak yer cast ile veriye erişiyor.

Yalnız sorunumu tam olarak anlatamamışım sanırım. Burada isEqual işlevini yapmaya çalışmıyorum. Yapmaya çalıştığım bu işlevlere nasıl ulaşılacağı. Bunu bu şekilde yaptım ama daha iyi bir yöntem olduğunu düşünüyorum.

Alıntı:

>

struct DataType{
bool function(var, var) isEqual;
void function(var current, var[] params) call;
}

Alıntı:

>

Şu variant modülünü hatim etme zamanı geldi

Salih hocam ben pek beğenmedim açıkçası bu yapıyı çok performans kaybına sebep oluyor.

Son yaptıklarımı github sayfasına yükledim

Zekeriya

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

February 22, 2013

İstediğin, o yazdığın isEqual işlevini DataType'ın içine opEquals olarak taşımak mı acaba?

Ali

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

February 23, 2013

Ali hocam türleri aşağıdaki gibi tanımladıktan sonra her türün kendisine ait işlevlerini tutmak istiyorum.
Bunu bu şekilde yaptım ama sizlerin de görüşünü almak istedim ne kadar doğru ne kadar yanlış diye

enum DT : int {//Türler
	STRING, INT, dFunction
}
struct var{//Değişken
	DT typ;//Türü
	void* val;//Değeri
}
//Bu şekilde değişkenleri türlerle bağdaştırdım. void* üzerinde int, string her ne ise onun adresi yatıyor.
DataType[] datatypes; //Daha sonra bu datatypes adında bir dizi oluşturup her bir türe karşılık işlevleri tanımladım.
void main(){//
	datatypes = new DataType[DT.max + 1];
	RhString.link();//RhString i ayrı bir dosya yaptım ve o dosya üzerinde link diye bir işlev tanımladım.
//Sonra o türe ait işlevi çağırmak için ise
	string metin = "Ali Çehreli";
	auto degisken = var(DT.STRING, &metin);
	string metin2 = "Salih Dinçer";
	auto degisken2 = var(DT.STRING, &metin2);
	writefln("sonuç: %s", datatypes[degisken.typ].isEqual(degisken, degisken2));
}
struct DataType{//DataType'ı ve varsayılan işlevlerini tanımladım.
	bool function(var, var) isEqual = function(var current, var b){
		throw new Exception(text(current.typ)~" veri türü için bu işlevi çağıramazsınız!");
		return false;
	};
	void function(var, var[]) call = function(var current, var[] params){
		throw new Exception(text(current.typ)~" veri türünü çağıramazsınız!");
	};
	void function(var) inc = function(var current){
		throw new Exception(text(current.typ)~" veri türünü arttıramazsınız!");
	};
	string function(var) toString = function(var current){
		return "[typeid: "~text(current.typ)~"]";
	};
}
//RhString Dosyası
module RhString;
import vm;
import std.conv;
void link(){
	with(DT){
		datatypes[STRING].isEqual = &isEqual;
		datatypes[STRING].toString = &toString;
	}
}
bool isEqual(var p1, var p2){
	if(p1.typ == p2.typ && *cast(string*) p1.val == *cast(string*) p2.val)
		return true;
	return false;
}
string toString(var p1){
	return *cast(string*) p1.val;
}

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

February 23, 2013

Alıntı (zekeriyadurmus):

>
> /* Bu şekilde değişkenleri türlerle bağdaştırdım. void* üzerinde int, string
>  * her ne ise onun adresi yatıyor.
>  */
> DataType[] datatypes; /* Daha sonra bu datatypes adında bir dizi oluşturup
>                        * her bir türe karşılık işlevleri tanımladım.
>                        */
> void main(){
> 	datatypes = new DataType[DT.max + 1];
> 	RhString.link(); /* RhString i ayrı bir dosya yaptım ve
>                       *  o dosya üzerinde link diye bir işlev tanımladım.
>                       */
>   :  :  :
> ```

>
Bu global değişken (datatypes dizisi) içinden çıkılmaz sorunlara neden olabilir. Bunun yanında çekincem de, başka modüldeki alelade bir işlevin adresini kullanmak ne kadar doğru bilmiyorum. Neden temsilci kullanmıyorsun? Sanırım şurada benzer bir şey yapmıştım: http://ddili.org/forum/thread/1008

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

Benim anladığım kadarıyla sınıflarda zaten bulunan sanal işlev çağırma (virtual dispatch) düzeneğini yapılara uyguluyorsun. (C'de de böyle yapılır.)

Sınıf kullanmak yerine yapılara uygulamanın nedeni de yapılar sınıflardan daha ekonomik oldukları için, değil mi? Ama dikkat edersen sınıflardaki olanakları ekledikçe artık senin yapı da bir sınıf kadar büyümeye başladı: Türü için bir enum ve sınıfların referans türü olmalarını sağlayan iç değişkenleri gibi bir de void*.

Böyle devam edebilirsin çünkü hep söylendiği gibi, herşeyi assembly'de de yapabilirsin C'de de yapabilirsin. Ama Salih'in de belirttiği gibi, D'nin üst düzey olanaklarını kullanmazsan bu işi daha zor yapmış oluyorsun.

Salih, başka modüldeki işlevi kullanmakta teknik olarak bir sorun olmamalı. Zekeriya D'nin opEquals'ını isEqual diye başka bir isimle gerçekleştirmiş oluyor. Bizim yazdığımız opEquals'lar da hep başka modüllerde olduklarından temelde aynı olmalı.

Ali

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

« First   ‹ Prev
1 2