#include #include "type.h" #include "operation/math.h" #include "function/apply.h" #include "list/list.h" #include "list/operation/higher/filter.h" #include "list/generator/iota.h" #include "runtime/list/for_each.h" // (define candidates (iota 1000 2 1)) using candidates = tav::Iota, tav::Int<2>, tav::Int<1>>::type; // (define (isMultipleOf candidate base) (= (modulo candidate base) 0)) template < typename Candidate, typename Base > using isMultipleOf = tav::IsEqualValue< tav::Modulo, tav::Int<0> >; // (define (removeMultiplesOf candidates base) // (remove (lambda (x) (isMultipleOf x base)) // candidates)) template < typename Candidates, typename Base > using removeMultiplesOf = tav::Remove< tav::Apply::template type, Candidates >; // (define (sieve candidates) // (cond ((null-list? candidates) (list)) // (else (cons (car candidates) // (sieve (removeMultiplesOf (cdr candidates) // (car candidates))))))) template struct Sieve { typedef typename tav::Cons< tav::Head, typename Sieve< typename removeMultiplesOf< tav::Tail, tav::Head >::type >::type >::type type; }; template <> struct Sieve { typedef void type; }; // (define primes (sieve candidates)) using primes = Sieve::type; int main(int, char **) { tav::runtime::for_each([](const int x) { std::cout << x << std::endl; }); }