Thread overview
February 23, 2013
module main;
import std.stdio;

enum e1 : int{
	v1, v2
}

enum e2 : int{
	v3, v4
}

void main(string[] argv){
	e1[] iz;
	iz ~= e2.v1;
}

2 enum da int türünde olmasına rağmen e1 dizisine e2 atamıyorum. İsteğim aslında e1 i genişletmek.

Zekeriya

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

February 23, 2013

Sanırım cast(e1) kullanmalısın...

Çünkü bu iki enum sonuçta bir tür ve birbirleriyle karışmamasını sağlayan iki farklı ismi var.

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

February 23, 2013

Bende int dizisine çevirdim. Ama bu seferde print yaparken v1 v2 yazmıyor 0 1 yazıyor.

Zekeriya

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

February 23, 2013

Alıntı:

>

"e1'in yasal değerleri v1 ve v2" olsun demişken ona bambaşka bir değer atayamamalıyız. Acaba yapmak istediğini başka biçimde çözebilir miyiz? Nasıl bir probleme çözüm arıyorsun?

Lexer içerisinde bazı türler tanımladım. Parser içerisinde de bu türleri genişletmek istiyorum.

Zekeriya

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

February 23, 2013

Ali hocam kod harika gözüküyor. Ama bir şey soracağım.

2 enumu da int e çevirmiştim. Int'e çevirmeden önceki halinde olduğu var sayarsak bu kodu yazdığımızda

e1[] iz;
iz ~= e2.v1;

Yukarıdaki gibi e1 ve e2 yi aynı imiş gibi işlem yapabilir miyiz?

Şimdi eğer e2 : e1 şeklinde birşey yazarsak e2 enumunun en büyük değeri veya elaman sayısı e1 ile sınırlı kalıyor ve genişlemiyor

Zekeriya

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

February 23, 2013

"e1'in yasal değerleri v1 ve v2" olsun demişken ona bambaşka bir değer atayamamalıyız. Acaba yapmak istediğini başka biçimde çözebilir miyiz? Nasıl bir probleme çözüm arıyorsun?

Ali

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

February 24, 2013

Sanki bu iş için en uygun Çağrışımsal Dizi (associative array)...

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

February 23, 2013

Tür genişletmenin bir çözümü NYP'deki türetmedir. O olanağı kullanmak istemediğine göre bunu kendin kodlamak zorundasın ve öyle de yapıyorsun zaten. Ne yazık ki D'de enum'a değer eklenemiyor. Ama D çok yetenekli olduğu için bir biçimde halledilebilir:

import std.stdio;
import std.array;
import std.traits;
import std.conv;

string değerListesi(string[] değerler...)
{
   /* Burada basitçe format kullanmak isterdik ama hata veriyor:
    *
    *   format("%(%s,%)", değerler);
    *
    * Error: static assert  "Cannot put a char[] into a Appender!(string)"
    */
   string sonuç;

   if (!değerler.empty) {
       sonuç ~= değerler.front;
       değerler.popFront();

       foreach (değer; değerler) {
           sonuç ~= ',';
           sonuç ~= değer;
       }
   }

   return sonuç;
}

enum e1 {
   v1, v2
}

string enumGenişlet(AsılEnum, string yeniEnum)(string[] yeniDeğerler...)
{
   string sonuç = "enum " ~ yeniEnum ~ '{';

   sonuç ~= değerListesi([ EnumMembers!AsılEnum ].to!(string[]));
   if (!sonuç.empty) {
       sonuç ~= ',';
   }
   sonuç ~= değerListesi(yeniDeğerler);

   sonuç ~= '}';

   return sonuç;
}

mixin (enumGenişlet!(e1, "e2")("v3", "v4"));

void main()
{
   foreach (değer; EnumMembers!e2) {
       writeln(değer);
   }
}

Çıktısı:
'v1
v2
v3
v4
'
Ali

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

February 23, 2013

Alıntı (zekeriyadurmus):

>
> e1[] iz;
> iz ~= e2.v1;
> ```

> Yukarıdaki gibi e1 ve e2 yi aynı imiş gibi işlem yapabilir miyiz?
>

Ne yazık ki hayır.

Ali

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

Alıntı:

>

Sanki bu iş için en uygun Çağrışımsal Dizi (associative array)...

Çok yavaşlar ama daha hızlı olan enum yapısını kullanmak daha uygun.

Zekeriya

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