Lisp 스타일 C++ 템플릿 메타 프로그래밍
발행: (2026년 3월 8일 AM 07:21 GMT+9)
2 분 소요
원문: Hacker News
Source: Hacker News
개요
C++ 템플릿 메타 프로그래밍을 Lisp 스타일로 구현했습니다.
C++17이 필요합니다. 예시는 test.cc를 참고하세요.
예시: 에라토스테네스의 체
#include
using namespace lmp;
// infinite list of integers starting at n
meta_fn(infinite_integers, int n) {
// `let_lazy(name, expr)` is similar to `(define name (delay expr))` in Scheme
let_lazy(next, infinite_integers);
meta_return (Cons, next>);
};
// filter out numbers divisible by n
meta_fn(filter_mod, class lst, int n) {
let_lazy(tail, filter_mod, n>);
meta_return (
cond, Int>, Int>,
tail,
Cons, tail>>);
};
// classic prime sieve
meta_fn(prime_sieve, class lst) {
static constexpr int n = car::value;
let_lazy(tail, prime_sieve, n>>);
meta_return (Cons, tail>);
};
using primes = prime_sieve>;
static_assert(nth::value == 2);
static_assert(nth::value == 3);
static_assert(nth::value == 5);
static_assert(nth::value == 7);
static_assert(nth::value == 11);
static_assert(nth::value == 13);
동등한 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)))