Article illustration 1

"The dark side of the force is a pathway to many abilities, some considered to be unnatural." -- Darth Sidious

This ominous Star Wars quote aptly introduces Metalang99 – a library that unlocks previously impossible metaprogramming capabilities in pure C99. By implementing an interpreted functional language atop the C preprocessor, it enables:

// Compile-time list operations
static int five_threes[] = {
    ML99_LIST_EVAL_COMMA_SEP(ML99_listReplicate(v(5), v(3))),
};

// Recursive factorial macro
#define factorial(n) ML99_natMatch(n, v(factorial_))
#define factorial_Z_IMPL(...) v(1)
#define factorial_S_IMPL(n) ML99_mul(ML99_inc(v(n)), factorial(v(n)))

// Argument overloading
#define Rect_new(...) ML99_OVERLOAD(Rect_new_, __VA_ARGS__)

Why This Matters for Embedded and Systems Developers

Most C metaprogramming relies on crude text substitution. Metalang99 fundamentally changes the game by providing:

  1. True recursion without depth limits through continuation-passing style evaluation
  2. Algebraic data types via companion library Datatype99, enabling pattern matching:
datatype(
    BinaryTree,
    (Leaf, int),
    (Node, BinaryTree *, int, BinaryTree *)
);
  1. Compile-time error reporting with human-readable diagnostics:
error: static assertion failed: "ML99_div: 18 is not divisible by 4"

Real-World Impact

Metalang99 isn't academic experimentation. It drives production systems at OpenIPC, generating:
- Type-safe RTSP 1.0 protocol implementations
- Virtual dispatch via Interface99
- Over 50k lines of maintainable macro-generated code

The Philosophy Behind the Madness

Creator Hirrolot developed Metalang99 after hitting limitations with Boost/Preprocessor. Traditional approaches require:
- Manual recursion depth tracking
- Obfuscated context passing
- Megabyte-sized error dumps

Metalang99 solves these by establishing a functional paradigm for metaprograms, treating macros as reducible expressions rather than text templates.

Getting Started

Integration requires just two steps:
1. Add metalang99/include to compiler paths
2. Disable full macro backtraces:

# Clang
-fmacro-backtrace-limit=1
# GCC
-ftrack-macro-expansion=0

For CMake users:

include(FetchContent)
FetchContent_Declare(metalang99 URL "https://github.com/...")
target_link_libraries(YourProject metalang99)

The New Frontier

While template metaprogramming dominates C++, Metalang99 brings similar power to resource-constrained environments. Its interpreter-based approach enables:
- Partial application for reusable metafunctions
- Runtime-like collections and algorithms
- Syntax validation before expansion

As embedded systems grow more complex, Metalang99 provides a path to maintainable metaprogramming without sacrificing C's core virtues. The force is strong with this one.

Source: Metalang99 GitHub Repository