Lisp 스타일 C++ 템플릿 메타 프로그래밍

발행: (2026년 3월 8일 AM 07:21 GMT+9)
2 분 소요

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)))
0 조회
Back to Blog

관련 글

더 보기 »