Perlの代替として(10)

map

Perl5以降にはmapというすばらしい関数がある。
次は、配列の各要素を2倍にする。


my @a = ( 1, 2, 3 );
my @b = map { $_ * 2 } @a;

for(@b) {
print $_, ",";
}
print "\n";


こんな関数はDにはないが、自作するのは簡単。


import std.cstream;

void main(char[][] arg) {
int[] a = [ 1, 2, 3 ];
int[] b = map( (int e) { return e * 2; }, a);

foreach(e; b) {
dout.writef("%d,", e);
}
dout.writefln();
}

T[] map(T)(T delegate(T) f, T[] a) {
T[] b;
b.length = a.length;
for(int i = 0; i < a.length; i++)
b[i] = f(a[i]);
return b;
}

ついでにgrepも作っておこう。
次は、配列から偶数のみ選び出す。


import std.cstream;

void main(char[][] arg) {
int[] a = [ 1, 2, 3, 4, 5, 6 ];
int[] b = grep( (int e) { return e % 2 == 0; }, a);

foreach(e; b) {
dout.writef("%d,", e);
}
dout.writefln();
}

T[] grep(T)(bool delegate(T) f, T[] a) {
T[] b;
foreach(e; a) {
if(f(e)) {
b.length = b.length + 1;
b[b.length-1] = e;
}
}
return b;
}