gen.h

Support for C language constructions.

Some decent usage examples can be found in datatype99/examples/derive.

Defines

ML99_semicoloned(...)

Puts a semicolon after provided arguments.

Examples

#include <metalang99/gen.h>

// int x = 5;
ML99_semicoloned(v(int x = 5))

ML99_braced(...)

Puts provided arguments into braces.

Examples

#include <metalang99/gen.h>

// { int a, b, c; }
ML99_braced(v(int a, b, c;))

ML99_assign(lhs, ...)

Generates an assignment of provided variadic arguments to lhs.

Examples

#include <metalang99/gen.h>

// x = 5, 6, 7
ML99_assign(v(x), v(5, 6, 7))

ML99_assignInitializerList(lhs, ...)

A shortcut for ML99_assign(lhs, ML99_braced(...)).

ML99_assignStmt(lhs, ...)

A shortcut for ML99_semicoloned(ML99_assign(lhs, ...)).

ML99_assignInitializerListStmt(lhs, ...)

A shortcut for ML99_assignStmt(lhs, ML99_braced(...)).

ML99_invoke(f, ...)

Generates a function/macro invocation.

Examples

#include <metalang99/gen.h>

// If you are on C11.
ML99_invoke(v(_Static_assert), v(1 == 1, "Must be true"))

ML99_invokeStmt(f, ...)

A shortcut for ML99_semicoloned(ML99_invoke(f, ...)).

ML99_prefixedBlock(prefix, ...)

Generates prefix { code }.

Examples

#include <metalang99/gen.h>

// if (1 == 1) {
//     printf("x = %d\n", x);
// }
ML99_prefixedBlock(v(if (1 == 1)), v(printf("x = %d\n", x);))

ML99_typedef(ident, ...)

Generates a type definition.

Examples

#include <metalang99/gen.h>

// typedef struct { int x, y; } Point;
ML99_typedef(v(Point), v(struct { int x, y; }))

ML99_struct(ident, ...)

Generates a C structure.

Examples

#include <metalang99/gen.h>

// struct Point { int x, y; }
ML99_struct(v(Point), v(int x, y;))

ML99_anonStruct(...)

Generates an anonymous C structure.

Examples

#include <metalang99/gen.h>

// struct { int x, y; }
ML99_struct(v(int x, y;))

ML99_union(ident, ...)

The same as ML99_struct but generates a union.

ML99_anonUnion(...)

The same as ML99_anonStruct but generates a union.

ML99_enum(ident, ...)

The same as ML99_struct but generates an enumeration.

ML99_anonEnum(...)

The same as ML99_anonStruct but generates an enumeration.

ML99_fnPtr(ret_ty, name, ...)

Generates a function pointer.

Examples

#include <metalang99/gen.h>

// int (*add)(int x, int y)
ML99_fnPtr(v(int), v(add), v(int x), v(int y))

// const char *(*title)(void)
ML99_fnPtr(v(const char *), v(title), v(void))

ML99_fnPtrStmt(ret_ty, name, ...)

A shortcut for ML99_semicoloned(ML99_fnPtr(ret_ty, name, ...)).

ML99_times(n, ...)

Pastes provided arguments n times.

Examples

#include <metalang99/gen.h>

// ~ ~ ~ ~ ~
ML99_times(v(5), v(~))

ML99_repeat(n, f)

Invokes f n times, providing an iteration index each time.

Examples

#include <metalang99/gen.h>
#include <metalang99/util.h>

// _0 _1 _2
ML99_repeat(v(3), ML99_appl(v(ML99_cat), v(_)))

ML99_indexedParams(type_list)

Generates \((T_0 \ \_0, ..., T_n \ \_n)\).

If type_list is empty, this macro results in (void).

Examples

#include <metalang99/gen.h>

// (int _0, long long _1, const char * _2)
ML99_indexedParams(ML99_list(v(int, long long, const char *)))

// (void)
ML99_indexedParams(ML99_nil())

ML99_indexedFields(type_list)

Generates \(T_0 \ \_0; ...; T_n \ \_n\).

If type_list is empty, this macro results in emptiness.

Examples

#include <metalang99/gen.h>

// int _0; long long _1; const char * _2;
ML99_indexedFields(ML99_list(v(int, long long, const char *)))

// ML99_empty()
ML99_indexedFields(ML99_nil())

ML99_indexedInitializerList(n)

Generates \(\{ \_0, ..., \_{n - 1} \}\).

If n is 0, this macro results in { 0 }.

Examples

#include <metalang99/gen.h>

// { _0, _1, _2 }
ML99_indexedInitializerList(v(3))

// { 0 }
ML99_indexedInitializerList(v(0))

ML99_indexedArgs(n)

Generates \(\_0, ..., \_{n - 1}\).

If n is 0, this macro results in emptiness.

Examples

#include <metalang99/gen.h>

// _0, _1, _2
ML99_indexedArgs(v(3))

// ML99_empty()
ML99_indexedArgs(v(0))