From 052144cabb126efe925a96f8a0597a0f2005d206 Mon Sep 17 00:00:00 2001 From: lemon Date: Mon, 23 Feb 2026 20:36:05 +0100 Subject: add metalang99 testsuite (preprocessor stress testing) --- test/external/metalang99/idioms.md | 44 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 test/external/metalang99/idioms.md (limited to 'test/external/metalang99/idioms.md') diff --git a/test/external/metalang99/idioms.md b/test/external/metalang99/idioms.md new file mode 100644 index 0000000..3ed23c8 --- /dev/null +++ b/test/external/metalang99/idioms.md @@ -0,0 +1,44 @@ +# Idioms + +_This document describes common idioms when using Metalang99, i.e., code patterns that have not been reified into abstractions yet._ + +## Detecting a keyword followed by parentheses + +To detect something like `abracadabra(1, 2, 3)`, follow this simple pattern: + +```c +#define DETECT_ABRACADABRA(x) ML99_IS_TUPLE(ML99_CAT(DETECT_ABRACADABRA_, x)) +#define DETECT_ABRACADABRA_abracadabra(...) () + +// 1 +DETECT_ABRACADABRA(abracadabra(1, 2, 3)) + +// 0 +DETECT_ABRACADABRA(blah) +``` + +## Extracting a value of a keyword followed by parentheses + +To get `1, 2, 3` from `abracadabra(1, 2, 3)`: + +```c +#define EXTRACT_ABRACADABRA(x) ML99_CAT(EXTRACT_ABRACADABRA_, x) +#define EXTRACT_ABRACADABRA_abracadabra(...) __VA_ARGS__ + +// 1, 2, 3 +EXTRACT_ABRACADABRA(abracadabra(1, 2, 3)) +``` + +## Interspersing a comma + +To intersperse a comma between one or more elements, put a comma before each element and pass them all to `ML99_variadicsTail`: + +```c +#define ARRAY_SUBSCRIPTS(array, n) \ + ML99_EVAL(ML99_variadicsTail(ML99_repeat(v(n), ML99_appl(v(GEN_SUBSCRIPT), v(array))))) +#define GEN_SUBSCRIPT_IMPL(array, i) v(, (array)[i]) +#define GEN_SUBSCRIPT_ARITY 2 + +// (animals)[0], (animals)[1], (animals)[2] +ARRAY_SUBSCRIPTS(animals, 3) +``` -- cgit v1.2.3