1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
|
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## unreleased
### Fixed
- Remove outdated Doxygen configuration options ([issue #34](https://github.com/hirrolot/metalang99/issues/34)).
## 1.13.5 - 2025-03-17
### Fixed
- Update the minimum required CMake version to 3.10.0 due to deprecation ([issue #33](https://github.com/hirrolot/metalang99/issues/33)).
## 1.13.4 - 2025-03-17
### Fixed
- Update the minimum required CMake version to 3.5.0 due to deprecation ([issue #32](https://github.com/hirrolot/metalang99/issues/32)).
## 1.13.3 - 2023-03-11
### Fixed
- Fix the `DOWNLOAD_EXTRACT_TIMESTAMP` CMake warning (see [datatype99/issues/15](https://github.com/hirrolot/datatype99/issues/15)).
## 1.13.2 - 2022-05-15
### Fixed
- Fix C++ compilation for `ML99_INTRODUCE_VAR_TO_STMT` and `ML99_INTRODUCE_NON_NULL_PTR_TO_STMT` ([issue #25](https://github.com/hirrolot/metalang99/issues/25)).
## 1.13.1 - 2021-12-09
### Fixed
- Specify `C` as the project language in `CMakeLists.txt`. Previously, CMake detected C++ and required a C++ compiler to compile the project.
## 1.13.0 - 2021-12-01
### Added
- Add the root `CMakeLists.txt` to be able to use CMake with [`FetchContent`] or [`add_subdirectory`] ([PR #20](https://github.com/hirrolot/metalang99/pull/20)).
- `list.h`:
- `ML99_listFilterMap` to filter a list with a maybe-returning function.
[`FetchContent`]: https://cmake.org/cmake/help/latest/module/FetchContent.html
[`add_subdirectory`]: https://cmake.org/cmake/help/latest/command/add_subdirectory.html
## 1.12.1 - 2021-11-23
### Deprecated
- Deprecate `ML99_catEval` because there were no use cases over time.
## 1.12.0 - 2021-11-09
### Added
- `choice.h`:
- `ML99_choiceData`, `ML99_CHOICE_DATA` to extract a choice value data.
- `gen.h`:
- Add `ML99_fnPtr(Stmt)` to generate a function pointer.
- New module `stmt.h`:
- Take `ML99_INTRODUCE_VAR_TO_STMT`, `ML99_INTRODUCE_NON_NULL_PTR_TO_STMT`, `ML99_CHAIN_EXPR_STMT`, `ML99_CHAIN_EXPR_STMT_AFTER`, and `ML99_SUPPRESS_UNUSED_BEFORE_STMT` from `gen.h`.
### Changed
- `choice.h`:
- Define the representation of choice types as `(tag, ...)`.
- `tuple.h`:
- Emit a fatal error in `ML99_untuple` if an argument is not a tuple.
- `gen.h`:
- Move all statement chaining macros to `stmt.h` (see above).
- Move `ML99_GEN_SYM` and `ML99_TRAILING_SEMICOLON` to `util.h`.
### Deprecated
- `tuple.h`:
- `ML99_untupleChecked` because it is the same as `ML99_untuple`.
- `ML99_tupleEval`, `ML99_untupleEval` because there were no use cases over time.
- `logical.h`:
- Move all functions to `bool.h`.
- `control.h`:
- Move `ML99_OVERLOAD` to `variadics.h`.
- Move `ML99_if`, `ML99_IF` to `bool.h`.
- Move `ML99_repeat`, `ML99_times` to `gen.h`.
## 1.11.0 - 2021-10-02
### Added
- New module `seq.h`:
- `ML99_seqIsEmpty`, `ML99_SEQ_IS_EMPTY` to check for the empty sequence.
- `ML99_seqGet`, `ML99_SEQ_GET` to get an `i`-indexed element.
- `ML99_seqTail`, `ML99_SEQ_TAIL` to get a tail.
- `ML99_seqForEach(I)` to iterate through each element.
- `logical.h`:
- `ML99_boolMatch(WithArgs)` to perform pattern matching on a boolean value.
### Changed
- `list.h`, `variadics.h`:
- Remove the requirement that `ML99_listFromTuples` and `ML99_variadicsForEach(I)` can accept at most 63 arguments.
## 1.10.0 - 2021-09-14
### Added
- `util.h`:
- `ML99_COMMA` that expands to a single comma.
### Deprecated
- `util.h`:
- `ML99_(L|R)PAREN` because they result in code that is difficult to reason about.
## 1.9.0 - 2021-08-27
### Added
- `metalang99.h`:
- `ML99_VERSION_COMPATIBLE` to check for a SemVer-compatible version.
- `ML99_VERSION_EQ` to check for an exact version.
## 1.8.0 - 2021-08-26
### Added
- `ident.h`:
- `ML99_charLit`, `ML99_CHAR_LIT` to convert a Metalang99 character to a C character literal.
## 1.7.0 - 2021-08-13
### Changed
- `assert.h`:
- Generate `_Static_assert` from the assertion macros if compiling on C11.
## 1.6.0 - 2021-08-13
### Added
- Tuple counterparts of variadics (`tuple.h`):
- `ML99_tupleCount`, `ML99_TUPLE_COUNT`.
- `ML99_tupleIsSingle`, `ML99_TUPLE_IS_SINGLE`.
- `ML99_tupleForEach(I)`.
### Fixed
- `util.h`:
- `ML99_cat3` & `ML99_cat4` to desugar to themselves instead of `ML99_cat`.
- `variadics.h`:
- Make `variadics.h` work without including `nat.h` & `util.h`.
## 1.5.0 - 2021-08-11
### Added
- `ML99_assignInitializerList(Stmt)` as `ML99_assign(Stmt)` counterparts for initializer lists.
## 1.4.1 - 2021-08-05
### Fixed
- Invalid C11 standard detection for `_Static_assert` ([issue #15](https://github.com/hirrolot/metalang99/issues/15)).
- Invalid C11 standard detection for `_Static_assert` on MSVC ([issue #16](https://github.com/hirrolot/metalang99/issues/16)).
## 1.4.0 - 2021-08-02
### Added
- `ML99_ALLOW_POOR_DIAGNOSTICS`: if your compiler does not support decent diagnostic messages, Metalang99 will emit an error that can be suppressed by defining this macro.
### Fixed
- Emit `_Static_assert` for diagnostics where possible:
- C11.
- Clang if `__has_extension(c_static_assert)`.
- GCC if newer than [4.6](https://gcc.gnu.org/gcc-4.6/changes.html).
## 1.3.0 - 2021-07-24
### Added
- `util.h`:
- `ML99_todo(WithMsg)` and `ML99_unimplemented(WithMsg)` to indicate unimplemented functionality.
### Fixed
- Handle the `(...) (...) ...` form in `ML99_isUntuple`:
- All the dependent public functions inherit this ability too: `ML99_isTuple`, `ML99_untupleChecked`, and `ML99_listFromTuples`.
- Now the interpreter is able to emit a syntax error for `v(123) v(456)`.
### Changed
- Emit syntax errors and errors from `ML99_fatal` right to a console if compiling on GCC.
## 1.2.0 - 2021-06-06
### Added
- `list.h`:
- `ML99_listFromTuples` to transform comma-separated tuples into a list.
- `util.h`:
- `ML99_(L|R)PAREN` that expand to an opening/closing parenthesis.
- `tuple.h`:
- `ML99_untupleChecked` to emit a fatal error if a provided argument is not a tuple.
- New module `ident.h`:
- Migrate `ML99_detectIdent`, `ML99_identEq`, `ML99_DETECT_IDENT`, `ML99_IDENT_EQ`, `ML99_C_KEYWORD_DETECTOR`, `ML99_UNDERSCORE_DETECTOR` from `util.h`.
- `ML99_(LOWER|UPPER)CASE_DETECTOR` to detect lower/uppercase characters.
- `ML99_DIGIT_DETECTOR` to detect digits.
- `ML99_char_eq`, `ML99_CHAR_EQ` to compare two characters.
- `ML99_is(Lower|Upper)case`, `ML99_IS_(LOWER|UPPER)CASE` to check whether a letter is lower/uppercased.
- `ML99_isDigit`, `ML99_IS_DIGIT` to check whether a character is digit.
- `ML99_isChar`, `ML99_IS_CHAR` to check whether an identifier is a character.
- `ML99_(LOWER|UPPER)CASE_CHARS` that expands to all comma-separated lower/uppercase characters.
- `ML99_DIGITS` that expands to all comma-separated digits.
### Changed
- `util.h`:
- Automatically include `ident.h` for backwards compatibility.
### Fixed
- Make Metalang99 work on TCC (see [datatype99/issues/10](https://github.com/hirrolot/datatype99/issues/10)).
## 1.1.0 - 2021-04-24
### Added
- `gen.h`:
- Statement chaining macros:
- `ML99_CHAIN_EXPR_STMT` to execute a statement before the next statement.
- `ML99_CHAIN_EXPR_STMT_AFTER` to execute a statement afterwards.
- `ML99_INTRODUCE_NON_NULL_PTR_TO_STMT` to introduce a non-null pointer to a statement.
- Other:
- `ML99_GEN_SYM` to generate unique identifiers.
- `ML99_TRAILING_SEMICOLON` to force a trailing semicolon.
- `ML99_semicoloned` that puts a semicolon after its argument.
- `ML99_assign` to assign something to something.
- `ML99_assignStmt` to generate an assignment statement.
- `ML99_invoke` to invoke a macro/function.
- `ML99_invokeStmt` to generate a macro/function invocation statement.
- `ML99_prefixedBlock` to generate `prefix { code }`.
- `util.h`:
- Dealing with identifiers:
- `ML99_detectIdent`.
- `ML99_identEq`, `ML99_IDENT_EQ` to compare two identifiers.
- `ML99_C_KEYWORD_DETECTOR` to detect the C11 keywords.
- `ML99_UNDERSCORE_DETECTOR` to detect the underscore character (`_`).
- Other:
- `ML99_uncomma` to evaluate terms with the space-separator.
- `ML99_reify` to reify a macro/function to a Metalang99-compliant metafunction.
- `ML99_cat3`, `ML99_CAT3`, `ML99_CAT3_PRIMITIVE`.
- `ML99_cat4`, `ML99_CAT4`, `ML99_CAT4_PRIMITIVE`.
- `assert.h`:
- `ML99_assert`, `ML99_assertEq`.
- `variadics.h`:
- `ML99_variadicsIsSingle`, `ML99_VARIADICS_IS_SINGLE`.
- Built-in data type assertion macros:
- `tuple.h`: `ML99_assertIsTuple`.
- `nat.h`: `ML99_assertIsNat`.
### Fixed
- `assert.h`:
- Parenthesize expressions passed to `ML99_ASSERT`, `ML99_ASSERT_EQ`.
### Changed
- `gen.h`:
- `ML99_INTRODUCE_VAR_TO_STMT` can deal with several variables.
### Deprecated
- `gen.h`:
- `ML99_SUPPRESS_UNUSED_BEFORE_STMT` (use `ML99_CHAIN_EXPR_STMT((void)expr)` instead).
## 1.0.0 - 2021-03-27
### Added
- `ML99_QUOTE`.
### Removed
- `ML99_consume`, `ML99_CONSUME`.
### Changed
- Move `ML99_TERMS` from `util.h` to `lang.h`.
- Return a list of tuples from `ML99_listZip`, accept a list of tuples in `ML99_listUnzip`, return a tuple of lists from `ML99_listPartition`.
- `ML99_listEval` => `ML99_LIST_EVAL`, `ML99_listEvalCommaSep` => `ML99_LIST_EVAL_COMMA_SEP`.
- Accept ignored variadics in `ML99_nil`, `ML99_empty`, `ML99_true`, `ML99_false`, `ML99_nothing` (and their plain versions).
### Fixed
- Emit the correct metafunction name in case of an error in `ML99_listGet`.
- Remove a precondition that metafunctions passed to `ML99_listFoldl`, `ML99_listFolr`, `ML99_listFoldl1`, `ML99_listMap`, `ML99_listMapI`, `ML99_listFor`, `ML99_listMapInitLast`, and `ML99_listForInitLast` must evaluate to a single term.
## 0.5.0 - 2021-03-22
### Added
- `ML99_SUPPRESS_UNUSED_BEFORE_STMT`.
- `ML99_tupleGet`, `ML99_variadicsGet`, `ML99_TUPLE_GET`, `ML99_VARIADICS_GET`.
- `ML99_tupleAppend`, `ML99_tuplePrepend`.
- `ML99_indexedArgs`.
- `ML99_appl4`.
- `ML99_times`.
- `ML99_TRUE`, `ML99_FALSE`.
- `ML99_LEFT`, `ML99_RIGHT`, `ML99_IS_LEFT`, `ML99_IS_RIGHT`.
- `ML99_JUST`, `ML99_NOTHING`, `ML99_IS_JUST`, `ML99_IS_NOTHING`.
- `ML99_NAT_MAX`, `ML99_DIV_CHECKED`.
- `gen.h`.
### Removed
- `M_choiceEmpty(Plain)` (this allows a more optimal choice representation).
- `M_semicolon` (this macro turned out to be [dangerous](https://github.com/hirrolot/metalang99/commit/f12ba642b1fcf313e291fc0e353b01f666a980f8)).
- `M_tupleHead`, `M_variadicsHead`.
- `M_overload`.
- `M_when(Plain)`, `M_whenLazy(Plain)`.
- `M_putBefore`, `M_putAfter`, `M_putBetween`.
- `M_leftUnderscored`, `M_rightUnderscored`.
- `misc.h`, `eval.h`.
### Changed
- Do not guarantee the exact number of available reduction steps, instead keep it "reasonable" for the practical needs.
- Amalgamate `lang.h` with `eval.h`.
- Employ the `SCREAMING_CASE` naming convention for plain macros.
- All macros are prefixed with `ML99_`, unconditionally.
- Accept a number as a first argument and a function as the second in `ML99_repeat`.
- `M_get` => `ML99_listGet`.
- `M_overloadPlain` => `ML99_OVERLOAD`.
- `M_eval` => `ML99_EVAL`.
- `M_callTrivial` => `ML99_callUneval`.
- Move `ML99_repeat` from `misc.h` to `control.h`.
- Move `ML99_indexed(Params, Fields, InitializerList, Args)` from `misc.h` to `gen.h`.
- Move `ML99_braced`, `ML99_typedef`, `ML99_struct`, `ML99_anonStruct`, `ML99_union`, `ML99_anonUnion`, `ML99_enum`, `ML99_anonEnum` from `util.h` to `gen.h`.
- `M_assertPlain` => `ML99_ASSERT_UNEVAL`, `M_assertEmptyPlain` => `ML99_ASSERT_EMPTY_UNEVAL`.
- Rename "unsigned integers" to "natural numbers":
- `uint.h` => `nat.h`.
- `M_uintMatch(WithArgs)` => `ML99_natMatch(WithArgs)`.
- `M_uintEq` => `ML99_natEq`.
- `M_uintNeq` => `ML99_natNeq`.
### Fixed
- Emit a compile-time error if [`/Zc:preprocessor`] (MSVC) was not specified.
- Allow branches in `ML99_IF` expand to commas.
[`/Zc:preprocessor`]: https://docs.microsoft.com/en-us/cpp/build/reference/zc-preprocessor?view=msvc-160
## 0.4.2 - 2021-02-28
### Added
- `METALANG99_MAJOR`, `METALANG99_MINOR`, `METALANG99_PATCH`.
- `M_union`, `M_anonUnion`, `M_enum`, `M_anonEnum`.
- `METALANG99_GCC_PRAGMA`, `METALANG99_CLANG_PRAGMA`.
### Fixed
- Suppress Clang's `-Wshadow` for a variable produced by `M_INTRODUCE_VAR_TO_STMT`.
## 0.4.1 - 2021-02-28
### Added
- `M_DETECT_IDENT`
- `M_choicePlain`, `M_choiceEmptyPlain`, `M_consPlain`, `M_nilPlain`.
- `M_listMapInPlace`, `M_listMapInPlaceI`.
### Changed
- Increase the maximum arity from 16 to 255.
- Specify the exact number of commas produced by `M_indexedInitializerList`.
### Fixed
- Initialize variables produced by `M_semicolon` and `M_assertPlain` to suppress warnings.
## 0.4.0 - 2021-02-26
### Added
- `tuple.h`: `M_tuple(Plain)`, `M_tupleEval`, `M_untuple(Plain)`, `M_untupleEval`, `M_isTuple(Plain)`, `M_isUntuple(Plain)`, `M_tupleHead(Plain)`, `M_tupleTail(Plain)`.
### Changed
- Move the corresponding functions from `util.h` and `variadics.h` to `tuple.h`.
## 0.3.0 - 2021-02-26
### Added
- `M_when`, `M_whenPlain`, `M_whenLazy`, `M_whenLazyPlain`.
- `M_leftUnderscored`, `M_rightUnderscored`.
- `M_INTRODUCE_VAR_TO_STMT`.
- `M_terms`.
- `M_tupleHead`, `M_tupleHeadPlain`, `M_tupleTail`, `M_tupleTailPlain`.
- `M_indexedParams`, `M_indexedFields`, `M_indexedInitializerList`.
- `M_typedef`, `M_struct`, `M_anonStruct`.
- `M_choiceTag`, `M_choiceTagPlain`, `M_isNilPlain`, `M_isCons`, `M_isConsPlain`.
### Changed
- Make `M_variadicsHead` accept a single argument too.
- Now at most 63 variadic arguments are acceptable by `M_list`, `M_variadicsCount`, and `M_variadicsCountPlain`.
- Terms now need to be separated by commas, e.g. instead of `v(1) M_call(F, v(2)) v(3)`, write `v(1), M_call(F, v(2)), v(3)` or `M_terms(v(1), M_call(F, v(2)), v(3)`.
- The empty sequence is prohibited by `M_eval`, `M_call` and `M_abort`.
- Use American style endings (because it is prevalent):
- `M_(un)parenthesise(Eval)` => `M_(un)tuple(Eval)`.
- `M_isParenthesised` => `M_isTuple`.
- `M_isUnparenthesised` => `M_isUntuple`.
- `M_parenthesisedVariadics(Head|Tail)` => `M_tuple(Head|Tail)`.
- Shorten functions on unsigned integers:
- `M_uintInc(Plain)` => `M_inc(Plain)`.
- `M_uintDec(Plain)` => `M_dec(Plain)`.
- `M_uintAdd(3)` => `M_add(3)`.
- `M_uintSub(3)` => `M_sub(3)`.
- `M_uintMul(3)` => `M_mul(3)`.
- `M_uintDiv(3)` => `M_div(3)`.
- `M_uintDivChecked` => `M_divChecked`.
- `M_uintLesser(Eq)` => `M_lesser(Eq)`.
- `M_uintGreater(Eq)` => `M_greater(Eq)`.
- `M_uintMod` => `M_mod`.
- `M_uintMin` => `M_min`.
- `M_uintMax` => `M_max`.
- `M_variadicsMap` => `M_variadicsForEach`, `M_variadicsMapI` => `M_variadicsForEachI`.
### Fixed
- `aux.*` => `util.*` for compatibility with Windows.
### Removed
- `M_variadicsMapCommaSep`, `M_variadicsMapICommaSep` (better use lists).
- `M_const2`, `M_const3`.
## 0.2.0 - 2021-02-05
### Changed
- The project name `Epilepsy` => `Metalang99` (more neutral).
### Fixed
- Reporting about syntactic mismatches.
## 0.1.0 - 2021-02-04
### Added
- This excellent project.
|