История изменений
Исправление MOPKOBKA, (текущая версия) :
Попробовал си, и лямбды накостыленные через расширения, еще хуже чем цпп! С их оптимизацией у gcc туго, а с помощью clang не удалось собрать. Так что проблемы с реализацией прямого compose из haskell есть проблемы по производительности.
#include <stdio.h>
#include <stdlib.h>
#define LAMBDA(T, BODY) ({ inline T _f BODY _f; })
#define COMPOSE(T, F1, F2) LAMBDA(T, (T x) { return F1(F2(x)); })
int main(int argc, char **argv) {
long r = 0, end = atol(argv[1]) + 1;
__auto_type f = LAMBDA(long, (long x) { return x == 0; });
__auto_type g = LAMBDA(long, (long x) { return x % 2; });
__auto_type cond = COMPOSE(long, f, g);
for (long i = 1; i < end; ++i) if (cond(i)) r += i;
printf("%ld\n", r);
return 0;
}
C = 0m1,154s
Haskell = 0m0,101s
Исправление MOPKOBKA, :
Попробовал си, и лямбды накостыленные через расширения, еще хуже чем цпп! С их оптимизацией у gcc туго, а с помощью clang не удалось собрать. Так что проблемы с реализацией прямого compose из haskell есть проблемы.
#include <stdio.h>
#include <stdlib.h>
#define LAMBDA(T, BODY) ({ inline T _f BODY _f; })
#define COMPOSE(T, F1, F2) LAMBDA(T, (T x) { return F1(F2(x)); })
int main(int argc, char **argv) {
long r = 0, end = atol(argv[1]) + 1;
__auto_type f = LAMBDA(long, (long x) { return x == 0; });
__auto_type g = LAMBDA(long, (long x) { return x % 2; });
__auto_type cond = COMPOSE(long, f, g);
for (long i = 1; i < end; ++i) if (cond(i)) r += i;
printf("%ld\n", r);
return 0;
}
C = 0m1,154s
Haskell = 0m0,101s
Исходная версия MOPKOBKA, :
Попробовал си, и лямбды накостыленные через расширения, еще хуже чем цпп! С их оптимизацией у gcc туго, а с помощью clang не удалось собрать.
#include <stdio.h>
#include <stdlib.h>
#define LAMBDA(T, BODY) ({ inline T _f BODY _f; })
#define COMPOSE(T, F1, F2) LAMBDA(T, (T x) { return F1(F2(x)); })
int main(int argc, char **argv) {
long r = 0, end = atol(argv[1]) + 1;
__auto_type f = LAMBDA(long, (long x) { return x == 0; });
__auto_type g = LAMBDA(long, (long x) { return x % 2; });
__auto_type cond = COMPOSE(long, f, g);
for (long i = 1; i < end; ++i) if (cond(i)) r += i;
printf("%ld\n", r);
return 0;
}
C = 0m1,154s
Haskell = 0m0,101s