digitalmars.D.learn - simple syntax issue with template
- Lloyd Dupont (25/25) Jun 13 2011 I'm trying to create 2 extra method for arrays ("range" would be better,...
- Lloyd Dupont (28/28) Jun 13 2011 removed some obvious error, still stumped on the templated syntax ...
- Dmitry Olshansky (20/45) Jun 13 2011 It's not exactly clear what's your problem, since you haven't put a
- Lloyd Dupont (32/32) Jun 13 2011 ho.. plenty of silly mistake indeed.. thanks for spotting them!
- Dmitry Olshansky (8/41) Jun 13 2011 Yeah, I think I've hit this issue before, and used plain cast(T[])[].
- Joshua Niehus (21/46) Jun 13 2011 Hi Lloyd,
I'm trying to create 2 extra method for arrays ("range" would be better,
though I don't quite understand what is a "range")
Although I have some indecipherable (to me) compiler error...
What's wrong with the code below?
==================
import std.algorithm;
public:
void remove(T)(ref T[] array, T element)
{
auto index = array.countUntil!("a == b", T[], T)(array, element);
removeAt(index);
}
void removeAt(T)(ref T[] array, sizediff_t index)
{
if(index < 0 || index >= array.length)
return;
array.replaceInPlace(index, index + 1, []);
}
unittest
{
auto a = [1, 3, 4];
a.remove(3);
assert(a == [1, 4]);
}
======================
Jun 13 2011
removed some obvious error, still stumped on the templated syntax ...
so.. why is it not compiling?
(error:
Error: template std.algorithm.countUntil(alias pred = "a == b",R1,R2) if
(is(typeof(startsWith!(pred)(haystack,needle)))) does not match any function
template declaration
)
=====
import std.algorithm;
public:
void remove(T)(ref T[] array, T element)
{
sizediff_t index = array.countUntil!("a == b", T[], T)(array, element);
removeAt(array, index);
}
void removeAt(T)(ref T[] array, sizediff_t index)
{
if(index < 0 || index >= array.length)
return;
array.replaceInPlace(index, index + 1, []);
}
unittest
{
auto a = [1, 3, 4];
a.remove(3);
assert(a == [1, 4]);
}
=====
Jun 13 2011
On 13.06.2011 16:03, Lloyd Dupont wrote:
I'm trying to create 2 extra method for arrays ("range" would be
better, though I don't quite understand what is a "range")
Although I have some indecipherable (to me) compiler error...
What's wrong with the code below?
==================
import std.algorithm;
public:
void remove(T)(ref T[] array, T element)
{
auto index = array.countUntil!("a == b", T[], T)(array, element);
removeAt(index);
}
void removeAt(T)(ref T[] array, sizediff_t index)
{
if(index < 0 || index >= array.length)
return;
array.replaceInPlace(index, index + 1, []);
}
unittest
{
auto a = [1, 3, 4];
a.remove(3);
assert(a == [1, 4]);
}
======================
It's not exactly clear what's your problem, since you haven't put a
tiniest description of what the compiler outputs.
still:
array.countUntil!("a == b", T[], T)(array, element);
should be ether
countUntil!("a == b", T[], T)(array, element);
or:
array.countUntil!("a == b", T[], T)( element);
also drop thouse ugly explicit template params (the compiler can and
would figure them out anyway):
array.countUntil!"a == b"(element); //same as default
array.countUntil(element);
another one:
removeAt(index);
should be array.removeAt(index) or removeAt(array, index);
And last but not least there is remove in Phobos, it's just link to it
from summary table is constantly getting screwed up.
--
Dmitry Olshansky
Jun 13 2011
ho.. plenty of silly mistake indeed.. thanks for spotting them!
(maybe I should take a break and play the witcher 2 hey!?!? :)
however I still have a problem with removeAt now! :(
===
void removeAt(T)(ref T[] array, int index)
{
if(index < 0 || index >= array.length)
return;
array.replaceInPlace(index, index + 1, []);
}
===
will produce the following errors:
===
Error: template std.array.replaceInPlace(T,Range) if (isDynamicArray!(Range)
&& is(ElementEncodingType!(Range) : T) && !is(T == const(T)) && !is(T ==
immutable(T))) does not match any function template declaration
Error: template std.array.replaceInPlace(T,Range) if (isDynamicArray!(Range)
&& is(ElementEncodingType!(Range) : T) && !is(T == const(T)) && !is(T ==
immutable(T))) cannot deduce template function from argument types
!()(int[],int,int,void[])
===
mmm.. strangely enough the code below succeed!
====
void removeAt(T)(ref T[] array, int index)
{
if(index < 0 || index >= array.length)
return;
T[] empty;
array.replaceInPlace(index, index + 1, empty);
}
====
but T[].init didn't work either....?! ho well, thanks! :)
Jun 13 2011
On 13.06.2011 16:49, Lloyd Dupont wrote:ho.. plenty of silly mistake indeed.. thanks for spotting them! (maybe I should take a break and play the witcher 2 hey!?!? :)Why not ? ;-)however I still have a problem with removeAt now! :( === void removeAt(T)(ref T[] array, int index) { if(index < 0 || index >= array.length) return; array.replaceInPlace(index, index + 1, []); }Yeah, I think I've hit this issue before, and used plain cast(T[])[]. The problem is that [] is null of type void[], and template fails to resolve type. Seems like insertInPlace probably should take this special case into account.=== will produce the following errors: === Error: template std.array.replaceInPlace(T,Range) if (isDynamicArray!(Range) && is(ElementEncodingType!(Range) : T) && !is(T == const(T)) && !is(T == immutable(T))) does not match any function template declaration Error: template std.array.replaceInPlace(T,Range) if (isDynamicArray!(Range) && is(ElementEncodingType!(Range) : T) && !is(T == const(T)) && !is(T == immutable(T))) cannot deduce template function from argument types !()(int[],int,int,void[]) === mmm.. strangely enough the code below succeed! ==== void removeAt(T)(ref T[] array, int index) { if(index < 0 || index >= array.length) return; T[] empty; array.replaceInPlace(index, index + 1, empty); } ==== but T[].init didn't work either....?! ho well, thanks! :)-- Dmitry Olshansky
Jun 13 2011
I'm trying to create 2 extra method for arrays ("range" would be
better, though I don't quite understand what is a "range")
Although I have some indecipherable (to me) compiler error...
What's wrong with the code below?
==================
import std.algorithm;
public:
void remove(T)(ref T[] array, T element)
{
auto index = array.countUntil!("a == b", T[], T)(array, element);
removeAt(index);
}
void removeAt(T)(ref T[] array, sizediff_t index)
{
if(index < 0 || index >= array.length)
return;
array.replaceInPlace(index, index + 1, []);
}
unittest
{
auto a = [1, 3, 4];
a.remove(3);
assert(a == [1, 4]);
}
======================
Hi Lloyd,
why not just use the built in functionality of arrays?
//----------------------
import std.stdio;
void main() {
auto a = [1, 2, 3, 4, 5, 6, 7, 8];
remove(a, 3);
foreach (i; a) {
write(i, " ");
}
writeln("");
}
void remove(T) (ref T[] myarray, int element) {
auto front = myarray[0 .. (element -1)];
auto back = myarray[element .. $];
myarray = front ~ back;
// or simply: myarray = myarray[0 .. (element - 1)] ~ myarray[element ..
$];
}
//----------------------
Josh
Jun 13 2011









"Lloyd Dupont" <ld-REMOVE galador.net> 