Perlでリスト処理といえばmapとgrepにforeachだと思う。
たとえば、こんな感じで使える。実行すると"6 12 18 24 30"が標準出力に出力される。
#! /usr/bin/perl
use strict;
use warnings;
my @list1 = (1..10);
my @list2 = map { $_ * 3 } @list1;
my @list3 = grep { $_ % 2 == 0 } @list2;
foreach (@list3) { print $_, " "; }
print "\n";
これを無性にC言語でやりたくなったので実装してみた。
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
List_template(int)
int multi_3(int *in, int *out) {
*out = *in * 3;
return TRUE;
}
int is_even(int *in, int *bool) {
*bool = (*in % 2 == 0) ? TRUE : FALSE;
return TRUE;
}
int main() {
List list1 = NULL, list2 = NULL, list3 = NULL;
int i, *n;
list1 = List_func(create, int)();
if (list1 == NULL) goto END;
for (i = 1; i <= 10; i++) {
if (! List_func(push, int)(list1, &i)) goto END;
}
list2 = List_func(map, int)(list1, multi_3 );
if (list2 == NULL) goto END;
list3 = List_func(grep, int)(list2, is_even );
if (list3 == NULL) goto END;
List_foreach (n, list3) {
printf("%d ", *n);
}
printf("\n");
END:
List_func(delete, int)(list1);
List_func(delete, int)(list2);
List_func(delete, int)(list3);
return 0;
}
それでは恐ろしいリストの中身を。
まず、list.hの定義内容はこう。
続きを読む