読者です 読者をやめる 読者になる 読者になる

ギークもどきの日記帳

雑多な知識が垂れ流される場所。ほとんど無害。

C言語でmapしたかった

※注意: この記事に実用性はありません。

C言語で遊んでたら、突然写像の方のmapを書きたくなったので、ggってみた。

するとありがたいことにこんな記事が。 C系言語(C,C++,Objective-C,Java)で高階関数を使ってみる | ワンダープラネットエンジニア Blog

でも、配列の長さをいちいち指定しないといけないのがめんどくさい。

というわけで、マクロにしてみた。

#include <stdio.h>

int square(int n) {
  return n * n;
}

int* raw_int_map(const int *source, int *result, size_t n, int (*func)(int)) {
  for (int i = 0; i < n; i++) {
    result[i] = func(source[i]);
  }
  return result;
}

// マクロでラップ
#define map(SOURCE, RESULT, FUNC)\
  int RESULT[sizeof(SOURCE) / sizeof(SOURCE[0])] = {0};\
  raw_int_map(SOURCE, RESULT, sizeof(SOURCE) / sizeof(SOURCE[0]), FUNC);

int main(void) {
  int numbers[] = {1, 2, 3, 4, 5};
  map(numbers, squares, (int (*)(int))square);
  for (int i = 0; i < 5; i++) {
    printf("%d ", squares[i]);
  }
  return 0;
}

マクロの可能性を感じた。 要素の型をマクロの引数にしたら多相型関数っぽいこともできそう。

結論: Cのマクロ怖い

C言語で多相のmap

おまけ カッとなってやった

C言語で多相もどきとmap

多分この記事はn番煎じです。