```Lisp风格的C++模板元编程```
Lisp-style C++ template meta programming

原始链接: https://github.com/mistivia/lmp

这段C++代码使用模板元编程实现了一个素数筛法,模仿了Lisp(特别是Scheme)的风格。它利用C++17的特性进行编译时计算。 核心函数包括`infinite_integers`,生成一个无限的整数列表;`filter_mod`,过滤列表以移除能被给定数字整除的元素;以及`prime_sieve`,递归地应用`filter_mod`来生成素数列表。`let_lazy`引入了延迟求值,类似于Scheme的`delay`,防止编译期间发生无限递归。 `primes`类型被定义为将`prime_sieve`应用于从2开始的无限整数列表的结果。一系列`static_assert`语句验证了前六个素数(2, 3, 5, 7, 11, 13)在编译时被正确计算,展示了元程序的运行功能。包含的Scheme代码提供了直接等效的实现以供比较。

黑客新闻 新 | 过去 | 评论 | 提问 | 展示 | 招聘 | 提交 登录 Lisp风格的C++模板元编程 (github.com/mistivia) 17 分,来自 mistivia 3小时前 | 隐藏 | 过去 | 收藏 | 讨论 帮助 指南 | 常见问题 | 列表 | API | 安全 | 法律 | 申请YC | 联系 搜索:
相关文章

原文

C++ template meta programming in a Lisp style.

C++17 is needed.

See test.cc for examples.

#include <lmp.h>

using namespace lmp;

meta_fn(infinite_integers, int n) {
    // `let_lazy(name, expr)` is similar to `(define name (delay expr))` in scheme
    let_lazy(next, infinite_integers<n + 1>);
    meta_return (Cons<Int<n>, next>);
};

meta_fn(filter_mod, class lst, int n) {
    let_lazy(tail, filter_mod<cdr<lst>, n>);
    meta_return (
        cond<equal<mod<car<lst>, Int<n>>, Int<0>>,
            tail,
            Cons<car<lst>, tail>>);
};

meta_fn(prime_sieve, class lst) {
    static constexpr int n = car<lst>::value;
    let_lazy(tail, prime_sieve<filter_mod<cdr<lst>, n>>);
    meta_return (Cons<Int<n>, tail>);
};

using primes = prime_sieve<infinite_integers<2>>;

static_assert(nth<primes, 0>::value == 2);
static_assert(nth<primes, 1>::value == 3);
static_assert(nth<primes, 2>::value == 5);
static_assert(nth<primes, 3>::value == 7);
static_assert(nth<primes, 4>::value == 11);
static_assert(nth<primes, 5>::value == 13);

Similar form in Scheme:

(define (infinite-integers n)
   (define next (delay (infinite-integers (+ n 1))))
   (cons n next))

(define (filter-mod lst n)
    (define tail (delay (filter-mod (force (cdr lst)) n)))
    (if (= (modulo (car lst) n) 0)
        (force tail)
        (cons (car lst) tail)))

(define (prime-sieve lst)
  (define n (car lst))
  (define tail (delay (prime-sieve (filter-mod (force (cdr lst)) n))))
  (cons n tail))

(define primes
  (prime-sieve (infinite-integers 2)))
联系我们 contact @ memedata.com