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))