LINUX.ORG.RU

История изменений

Исправление 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