digitalmars.D.learn - parsing again
Is it possible to do a call like
--
arrayLength!(T[])( temp, index[0..depth] );
//temp is (multi)array being created while parsing an (multi)array in a file
//index[] is an array of the current index
//depth = current depth
--
in stead of
--
switch( depth )
{
case 0:
if( temp.length < index[depth] ) temp.length = temp.length * 2;
break;
static if( is(T A:A[][]))
{
case 1:
if( temp[ index[0] ].length < index[depth] ) temp[index[0]].length =
temp[index[0]].length * 2;
break;
}
static if( is(T A:A[][][]))
{
case 2:
if( temp[ index[0] ][ index[1] ].length < index[depth] ) temp[
index[0] ][ index[1] ].length = temp[ index[0] ][ index[1] ].length * 2;
break;
}
default:
assert(false);
break;
}
--
Jun 30 2009
My mixin try (doesn't compile though :)
<3 downs
string ctToString(int i)
{
if (!i) return "0";
string res;
while (i) {
res = "0123456789"[i%10] ~ res;
i /= 10;
}
return res;
}
string index(int len)
{
string res;
for (int i = 0; i < len; ++i)
res ~= "[indices["~ctToString(i)~"]] ";
return res;
}
string casesString(T)(T array)
{
string res;
for (int i = 0; i < Depth!(T); ++i)
{
res ~= `case `~ctToString(i)~`:`~
` if( temp`~ index(i) ~`.length < index[`~ctToString(i)~`] ) temp`~
index(i) ~`.length = temp`~ index(i) ~`.length * 2 ;`
~`break;`;
}
return res;
}
pragma(msg, casesString!(T)(parsed));
ddata\ddata.d(330): Error: variable parsed is used before initialization
ddata\ddata.d(330): Error: cannot evaluate casesString(parsed) at compile
time
ddata\ddata.d(330): Error: string expected for message, not
'casesString(parsed)'
--
switch( depth )
{
case 0:
if( temp.length < index[depth] ) temp.length = temp.length * 2;
break;
static if( is(T A:A[][]))
{
case 1:
if( temp[ index[0] ].length < index[depth] ) temp[index[0]].length =
temp[index[0]].length * 2;
break;
}
static if( is(T A:A[][][]))
{
case 2:
if( temp[ index[0] ][ index[1] ].length < index[depth] ) temp[
index[0] ][ index[1] ].length = temp[ index[0] ][ index[1] ].length * 2;
break;
}
default:
assert(false);
break;
}
--
Jul 01 2009
Kisses Ary:
It seems you can't mixin cases separately, you need to mixin the whole
switch (bug?)
string CasesString(int depth)
{
string res;
res ~= `switch( depth ){`;
for (int i = 0; i < depth; ++i)
{
res ~= `case `~ctToString(i)~`:`~
` if( temp`~ indexString(i) ~`.length < index[`~ctToString(i)~`] )
temp`~ indexString(i) ~`.length = temp`~ indexString(i) ~`.length * 2 ;`~
`break;`;
}
res ~= `default:assert(false);break;}`;
return res;
}
mixin ( CasesString(Depth!(T)) );
Jul 02 2009








"Saaa" <empty needmail.com>