このエントリーをはてなブックマークに追加

C言語で遅延評価

今更だけど、C言語で遅延評価やろうと思ったらこんな感じに、

関数ポインタ使ってやればいいだけのような気がしてならない。

#include <stdio.h>
#include <limits.h>

#define LAZY_DEF(type, funcname, ...) \
  typedef type (*LAZY_##funcname)(__VA_ARGS__); \
  type lazy_##funcname(__VA_ARGS__)
#define LAZY_ARG(funcname, callname, ...) \
  LAZY_##funcname callname, __VA_ARGS__
#define LAZY_FUNC(funcname, ...) \
  lazy_##funcname, __VA_ARGS__

LAZY_DEF(int, sub, int suba, int subb)
{
        return suba - subb;
}

LAZY_DEF(int, div, int diva, int divb)
{
        return diva / divb;
}

int
hoge(LAZY_ARG(sub, sub1, int sub1a, int sub1b), LAZY_ARG(div, div1, int diva, LAZY_ARG(sub, sub2, int sub2a, int sub2b)))
{
        if (sub1(sub1a, sub1b) != 0)
                return div1(diva, sub2(sub2a, sub2b));
        else
                return INT_MAX;
}

int main(void) {
        int a, b, c;

        a = 10;
        b = 3;
        c = 3;
        printf("%d\n", hoge(LAZY_FUNC(sub, b, c), LAZY_FUNC(div, a, LAZY_FUNC(sub, b, c))));

        a = 10;
        b = 4;
        c = 2;
        printf("%d\n", hoge(LAZY_FUNC(sub, b, c), LAZY_FUNC(div, a, LAZY_FUNC(sub, b, c))));

        return 0;
}
name:
email:
comment: