Loading...
Searching...
No Matches
gen.h File Reference

Support for C language constructions. More...

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

## Macros

#define | ML99_semicoloned(...) ML99_call(ML99_semicoloned, __VA_ARGS__)
| Puts a semicolon after provided arguments.
#define | ML99_braced(...) ML99_call(ML99_braced, __VA_ARGS__)
| Puts provided arguments into braces.
#define | ML99_assign(lhs, ...) ML99_call(ML99_assign, lhs, __VA_ARGS__)
| Generates an assignment of provided variadic arguments to `lhs`.
#define | ML99_assignInitializerList(lhs, ...) ML99_call(ML99_assignInitializerList, lhs, __VA_ARGS__)
| A shortcut for `ML99_assign(lhs, ML99_braced(...))`.
#define | ML99_assignStmt(lhs, ...) ML99_call(ML99_assignStmt, lhs, __VA_ARGS__)
| A shortcut for `ML99_semicoloned(ML99_assign(lhs, ...))`.
#define | ML99_assignInitializerListStmt(lhs, ...) ML99_call(ML99_assignInitializerListStmt, lhs, __VA_ARGS__)
| A shortcut for `ML99_assignStmt(lhs, ML99_braced(...))`.
#define | ML99_invoke(f, ...) ML99_call(ML99_invoke, f, __VA_ARGS__)
| Generates a function/macro invocation.
#define | ML99_invokeStmt(f, ...) ML99_call(ML99_invokeStmt, f, __VA_ARGS__)
| A shortcut for `ML99_semicoloned(ML99_invoke(f, ...))`.
#define | ML99_prefixedBlock(prefix, ...) ML99_call(ML99_prefixedBlock, prefix, __VA_ARGS__)
| Generates `prefix { code }`.
#define | ML99_typedef(ident, ...) ML99_call(ML99_typedef, ident, __VA_ARGS__)
| Generates a type definition.
#define | ML99_struct(ident, ...) ML99_call(ML99_struct, ident, __VA_ARGS__)
| Generates a C structure.
#define | ML99_anonStruct(...) ML99_call(ML99_anonStruct, __VA_ARGS__)
| Generates an anonymous C structure.
#define | ML99_union(ident, ...) ML99_call(ML99_union, ident, __VA_ARGS__)
| The same as ML99_struct but generates a union.
#define | ML99_anonUnion(...) ML99_call(ML99_anonUnion, __VA_ARGS__)
| The same as ML99_anonStruct but generates a union.
#define | ML99_enum(ident, ...) ML99_call(ML99_enum, ident, __VA_ARGS__)
| The same as ML99_struct but generates an enumeration.
#define | ML99_anonEnum(...) ML99_call(ML99_anonEnum, __VA_ARGS__)
| The same as ML99_anonStruct but generates an enumeration.
#define | ML99_fnPtr(ret_ty, name, ...) ML99_call(ML99_fnPtr, ret_ty, name, __VA_ARGS__)
| Generates a function pointer.
#define | ML99_fnPtrStmt(ret_ty, name, ...) ML99_call(ML99_fnPtrStmt, ret_ty, name, __VA_ARGS__)
| A shortcut for `ML99_semicoloned(ML99_fnPtr(ret_ty, name, ...))`.
#define | ML99_times(n, ...) ML99_call(ML99_times, n, __VA_ARGS__)
| Pastes provided arguments `n` times.
#define | ML99_repeat(n, f) ML99_call(ML99_repeat, n, f)
| Invokes `f` `n` times, providing an iteration index each time.
#define | ML99_indexedParams(type_list) ML99_call(ML99_indexedParams, type_list)
| Generates \((T_0 \ \_0, ..., T_n \ \_n)\).
#define | ML99_indexedFields(type_list) ML99_call(ML99_indexedFields, type_list)
| Generates \(T_0 \ \_0; ...; T_n \ \_n\).
#define | ML99_indexedInitializerList(n) ML99_call(ML99_indexedInitializerList, n)
| Generates \(\{ \_0, ..., \_{n - 1} \}\).
#define | ML99_indexedArgs(n) ML99_call(ML99_indexedArgs, n)
| Generates \(\_0, ..., \_{n - 1}\).

## Detailed Description

Support for C language constructions.

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

## Macro Definition Documentation

## ML99_anonStruct

#define ML99_anonStruct | ( |  | ... | ) | ML99_call(ML99_anonStruct, __VA_ARGS__)

Generates an anonymous C structure.

# Examples

#include <metalang99/gen.h>
// struct { int x, y; }
ML99_struct(v(int x, y;))
gen.h
Support for C language constructions.
ML99_struct
#define ML99_struct(ident,...)
Generates a C structure.
Definition gen.h:143
v
#define v(...)
A value that is pasted as-is; no evaluation occurs on provided arguments.
Definition lang.h:145

## ML99_assign

#define ML99_assign | ( |  | lhs,
|  |  | ...
| ) |  | ML99_call(ML99_assign, lhs, __VA_ARGS__)

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_assign
#define ML99_assign(lhs,...)
Generates an assignment of provided variadic arguments to lhs.
Definition gen.h:64

## ML99_braced

#define ML99_braced | ( |  | ... | ) | ML99_call(ML99_braced, __VA_ARGS__)

Puts provided arguments into braces.

# Examples

#include <metalang99/gen.h>
// { int a, b, c; }
ML99_braced(v(int a, b, c;))
ML99_braced
#define ML99_braced(...)
Puts provided arguments into braces.
Definition gen.h:50

## ML99_fnPtr

#define ML99_fnPtr | ( |  | ret_ty,
|  |  | name,
|  |  | ...
| ) |  | ML99_call(ML99_fnPtr, ret_ty, name, __VA_ARGS__)

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_fnPtr
#define ML99_fnPtr(ret_ty, name,...)
Generates a function pointer.
Definition gen.h:194

## ML99_indexedArgs

#define ML99_indexedArgs | ( |  | n | ) | ML99_call(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))
ML99_indexedArgs
#define ML99_indexedArgs(n)
Generates .
Definition gen.h:304

## ML99_indexedFields

#define ML99_indexedFields | ( |  | type_list | ) | ML99_call(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_indexedFields
#define ML99_indexedFields(type_list)
Generates .
Definition gen.h:266
ML99_list
#define ML99_list(...)
Constructs a list from its arguments.
Definition list.h:147
ML99_nil
#define ML99_nil(...)
The empty list.
Definition list.h:35

## ML99_indexedInitializerList

#define ML99_indexedInitializerList | ( |  | n | ) | ML99_call(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_indexedInitializerList
#define ML99_indexedInitializerList(n)
Generates .
Definition gen.h:285

## ML99_indexedParams

#define ML99_indexedParams | ( |  | type_list | ) | ML99_call(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_indexedParams
#define ML99_indexedParams(type_list)
Generates .
Definition gen.h:247

## ML99_invoke

#define ML99_invoke | ( |  | f,
|  |  | ...
| ) |  | ML99_call(ML99_invoke, f, __VA_ARGS__)

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_invoke
#define ML99_invoke(f,...)
Generates a function/macro invocation.
Definition gen.h:94

## ML99_prefixedBlock

#define ML99_prefixedBlock | ( |  | prefix,
|  |  | ...
| ) |  | ML99_call(ML99_prefixedBlock, prefix, __VA_ARGS__)

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_prefixedBlock
#define ML99_prefixedBlock(prefix,...)
Generates prefix { code }.
Definition gen.h:115

## ML99_repeat

#define ML99_repeat | ( |  | n,
|  |  | f
| ) |  | ML99_call(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_repeat
#define ML99_repeat(n, f)
Invokes f n times, providing an iteration index each time.
Definition gen.h:228
ML99_appl
#define ML99_appl(f,...)
Applies arguments to f.
Definition lang.h:93
util.h
Utilitary stuff.
ML99_cat
#define ML99_cat(a, b)
Concatenates a with b, leaving the result unevaluated.
Definition util.h:53

## ML99_semicoloned

#define ML99_semicoloned | ( |  | ... | ) | ML99_call(ML99_semicoloned, __VA_ARGS__)

Puts a semicolon after provided arguments.

# Examples

#include <metalang99/gen.h>
// int x = 5;
ML99_semicoloned(v(int x = 5))
ML99_semicoloned
#define ML99_semicoloned(...)
Puts a semicolon after provided arguments.
Definition gen.h:36

## ML99_struct

#define ML99_struct | ( |  | ident,
|  |  | ...
| ) |  | ML99_call(ML99_struct, ident, __VA_ARGS__)

Generates a C structure.

# Examples

#include <metalang99/gen.h>
// struct Point { int x, y; }
ML99_struct(v(Point), v(int x, y;))

## ML99_times

#define ML99_times | ( |  | n,
|  |  | ...
| ) |  | ML99_call(ML99_times, n, __VA_ARGS__)

Pastes provided arguments `n` times.

# Examples

#include <metalang99/gen.h>
// ~ ~ ~ ~ ~
ML99_times(v(5), v(~))
ML99_times
#define ML99_times(n,...)
Pastes provided arguments n times.
Definition gen.h:213

## ML99_typedef

#define ML99_typedef | ( |  | ident,
|  |  | ...
| ) |  | ML99_call(ML99_typedef, ident, __VA_ARGS__)

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_typedef
#define ML99_typedef(ident,...)
Generates a type definition.
Definition gen.h:129