<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Andrey Listopadov</title>
    <link>https://andreyor.st/tags/c/</link>
    <image>
      <title>Andrey Listopadov</title>
      <link>https://andreyor.st/tags/c/</link>
      <url>https://andreyor.st/tags/c/favicon-64.png</url>
    </image>
    <description>Posts tagged 'c' by Andrey Listopadov</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>Andrey Listopadov 2020-2026 - This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</copyright>
    <lastBuildDate>Tue, 15 Mar 2022 21:03:00 +0300</lastBuildDate>
    <atom:link href="https://andreyor.st/tags/c/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Generic* tuples in C</title>
      <link>https://andreyor.st/posts/2022-03-15-generic-tuples-in-c/</link>
      <guid>https://andreyor.st/posts/2022-03-15-generic-tuples-in-c/</guid>
      <description>&lt;p&gt;A day ago I was asked if it&amp;rsquo;s possible in C to make some preprocessor macro that will create a &lt;a href=&#34;https://en.wikipedia.org/wiki/Product_type&#34; target=&#34;_blank&#34;&gt;tuple object&lt;/a&gt; from something like &lt;code&gt;tuple(a, b, c)&lt;/code&gt;.
I&amp;rsquo;m not writing in C actively anymore, since I switched to Clojure some years ago, but I still like to poke with C from time to time.
I&amp;rsquo;ve thought to myself, that this should be doable via macros, and decided to try it out.
However, the C preprocessor is not the best way to write macros, yet unfortunately, it&amp;rsquo;s our only option.&lt;/p&gt;
&lt;p&gt;So what is our goal here?
A tuple is usually a fixed-size data structure that (often) can be indexed, and can contain elements of various types.
And because of that, it may be a bit tricky to do it in C because C doesn&amp;rsquo;t have a lot of tools for deducing type or generating code.
So in theory, something like a generic fixed-size array that can store elements of an arbitrary type will work fine.
And the only needed is to make a proper container for elements and write some macros to automate things.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve marked &amp;ldquo;generic&amp;rdquo; in the title with an asterisk, because, well, it&amp;rsquo;s C, there is no support for generics aside from the &lt;code&gt;_Generic&lt;/code&gt; dispatcher and, well, macro concatenation.
In this post, I&amp;rsquo;ll explain two solutions I&amp;rsquo;ve come up with, but both have their own constraints.
The first implementation below kinda allows for any type to be used as an element but requires adding new types every time you want something else.
The second implementation is more approachable, as it requires you to pre-define the type of the resulting tuple before you could use it.
So it&amp;rsquo;s not like true generics, but (I think) a close approximation.&lt;/p&gt;
&lt;h2 id=&#34;take-1-union-structs&#34;&gt;Take 1 - Union structs&lt;/h2&gt;
&lt;p&gt;Luckily for me, I&amp;rsquo;ve already experimented with &amp;ldquo;recursive&amp;rdquo; macros in C in my previous work, so I knew what to do.
In theory.
My initial thought was to generate an array of union structs.
Each struct would contain a &lt;code&gt;union&lt;/code&gt;, which would hold all possible types, and a &lt;code&gt;type&lt;/code&gt; field that would just tell us what type this particular union is.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#pragma once
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;enum&lt;/span&gt; TupleItemType {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    LONG,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DOUBLE,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    STRING,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;enum&lt;/span&gt; TupleItemType type;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;               pad[4];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;union&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt;   i32;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;double&lt;/span&gt; f64;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt; * string;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } value;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 1:&lt;/span&gt;
  File: &lt;code&gt;tuple.h&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;For now, I&amp;rsquo;ve decided to go with only three types, as it is easy to add more.
I&amp;rsquo;ve also created a &lt;code&gt;Tuple&lt;/code&gt; struct, that holds a pointer to an array of &lt;code&gt;TupleItem&lt;/code&gt; and its size:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; Tuple {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;       size;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;               pad[4];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem * tuple;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 2:&lt;/span&gt;
  File: &lt;code&gt;tuple.h&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;With that we can try to use it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;#34;tuple.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;pprint_tuple_item&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem * x);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;pprint_tuple_item&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem * x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;switch&lt;/span&gt; (x-&amp;gt;type) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;case&lt;/span&gt; LONG: printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;%ld&amp;#34;&lt;/span&gt;, x-&amp;gt;value.i32); &lt;span style=&#34;font-weight:bold&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;case&lt;/span&gt; DOUBLE: printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;%f&amp;#34;&lt;/span&gt;, x-&amp;gt;value.f64); &lt;span style=&#34;font-weight:bold&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;case&lt;/span&gt; STRING: printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;, x-&amp;gt;value.string); &lt;span style=&#34;font-weight:bold&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;pprint_tuple&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; Tuple * t);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;pprint_tuple&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; Tuple * t) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; t-&amp;gt;size - 1; i++) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pprint_tuple_item(&amp;amp;(t-&amp;gt;tuple[i]));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pprint_tuple_item(&amp;amp;t-&amp;gt;tuple[t-&amp;gt;size - 1]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;}&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem items[] = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem){.type = LONG, .value.i32 = 42},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem){.type = DOUBLE, .value.f64 = 22./7},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem){.type = STRING, .value.string = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;foobar&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; Tuple tuple = {.tuple = items, .size = 3};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pprint_tuple(&amp;amp;tuple);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 3:&lt;/span&gt;
  File: &lt;code&gt;main.c&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;Now, I know, that I shouldn&amp;rsquo;t create and pass arrays like that, but for now it&amp;rsquo;ll do.
With these helper functions in place, compiling and running this code yields an expected result:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clang -MM --std=c99 -Wpedantic -Wextra -Weverything -Wall  *.c &amp;gt; .depend
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clang -o main.o -c main.c --std=c99 -Wpedantic -Wextra -Weverything -Wall
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clang -o bin/tuple main.o --std=c99 -Wpedantic -Wextra -Weverything -Wall
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{42, 3.142857, &amp;#34;foobar&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, the original goal was to be able to say &lt;code&gt;tuple(42, 22./7, &amp;quot;foobar&amp;quot;)&lt;/code&gt; and be done with it.
So it&amp;rsquo;s the macro time!&lt;/p&gt;
&lt;p&gt;To solve this, we need a way to generate the array from above at preprocessor expansion time.
This is not an easy task, as the C preprocessor doesn&amp;rsquo;t have any way to iterate an arbitrary amount of arguments.
However, it&amp;rsquo;s certainly possible to iterate a &lt;em&gt;known&lt;/em&gt; amount of arguments.
So our task boils down to pre-defining &lt;em&gt;enough&lt;/em&gt; preprocessor stages to support a certain amount of arguments.
This is still a tricky task though.&lt;/p&gt;
&lt;p&gt;First, we&amp;rsquo;ll need a way to automatically detect the type of argument to set it to the &lt;code&gt;.type&lt;/code&gt; field.
This can be done either with extremely tricky and clunky use of &lt;code&gt;__builtin_types_compatible_p&lt;/code&gt; or via C11 new &lt;code&gt;_Generic&lt;/code&gt; construct.
I&amp;rsquo;ve decided to go with &lt;code&gt;_Generic&lt;/code&gt;, because it is much less code, and compile-time &lt;code&gt;if&lt;/code&gt; is not our best friend when generating code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define tuple_dispatch(x)                       \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    _Generic((x),                               \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;             char*: make_string,                \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;             double: make_double,               \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;             int: make_long,                    \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;             long: make_long)(x)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;make_long&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;make_double&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;double&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;make_string&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt; *);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 4:&lt;/span&gt;
  File: &lt;code&gt;tuple.h&lt;/code&gt;
&lt;/div&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;make_long&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt; x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem){.value.i32 = x, .type = LONG};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;make_double&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;double&lt;/span&gt; x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem){.value.f64 = x, .type = DOUBLE};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;make_string&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt; * x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem){.value.string = x, .type = STRING};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 5:&lt;/span&gt;
  File: &lt;code&gt;tuple.c&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;This macro will expand at &lt;strong&gt;compile&lt;/strong&gt; time to a correct helper function, creating our desired object.
Now we need to create a loop over all arguments of a variadic macro:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define CONCATENATE(arg1, arg2) CONCATENATE1(arg1, arg2)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define CONCATENATE1(arg1, arg2) CONCATENATE2(arg1, arg2)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define CONCATENATE2(arg1, arg2) arg1##arg2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define FOR_EACH_0(what, x) what(x)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define FOR_EACH_1(what, x, ...) what(x), FOR_EACH_0(what, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define FOR_EACH_2(what, x, ...) what(x), FOR_EACH_1(what, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define FOR_EACH_3(what, x, ...) what(x), FOR_EACH_2(what, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define TUPLE_EACH_NARG_(...)                   \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    CHOOSER(__VA_ARGS__, 3, 2, 1, 0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define CHOOSER(_0, _1, _2, _3, N, ...)         \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    N
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define TUPLE_EACH_(N, what, ...) CONCATENATE(FOR_EACH_, N)(what, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define TUPLE_(what, ...)                                           \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    TUPLE_EACH_(TUPLE_EACH_NARG_(__VA_ARGS__), what, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 6:&lt;/span&gt;
  File: &lt;code&gt;tuple.h&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;Here, I create an iteration over four arguments at most.
It&amp;rsquo;s easy to add more, just create more &lt;code&gt;#define FOR_EACH_&amp;lt;N&amp;gt;(what, x, ...) what(x), FOR_EACH_&amp;lt;N-1&amp;gt;(what, __VA_ARGS__)&lt;/code&gt; definitions, and add respecting numbers to &lt;code&gt;TUPLE_EACH_NARG_&lt;/code&gt; and &lt;code&gt;CHOOSER&lt;/code&gt; accordingly.
This will allow us to loop in a functional style, applying a &lt;code&gt;what&lt;/code&gt; macro to each argument of a vararg macro.
Here&amp;rsquo;s how we do it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;lt;malloc.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define tuple(...)                                                          \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    __extension__({                                                         \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        unsigned int       size  = TUPLE_EACH_NARG_(0, __VA_ARGS__);        \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        struct TupleItem   tmp[] = {TUPLE_(tuple_dispatch, __VA_ARGS__)};   \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        struct TupleItem * arr   = malloc(sizeof(struct TupleItem) * size); \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        for (unsigned int i = 0; i &amp;lt; size; i++)                             \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;            arr[i] = tmp[i];                                                \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        (struct Tuple){.tuple = arr, .size = size};                         \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 7:&lt;/span&gt;
  File: &lt;code&gt;tuple.h&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;Unfortunately, this uses a statement expression extension from GCC, but luckily for me, clang supports it, and I don&amp;rsquo;t care much about MSVC.
Here, we create an array &lt;code&gt;tmp&lt;/code&gt; with the &lt;code&gt;TUPLE_&lt;/code&gt; macro, that calls &lt;code&gt;tuple_dispatch&lt;/code&gt; over every argument in &lt;code&gt;__VA_ARGS__&lt;/code&gt;.
Let&amp;rsquo;s use it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;#34;tuple.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// ------8&amp;lt;-------
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; Tuple tuple = tuple(42, 22./7, &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;foobar&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pprint_tuple(&amp;amp;tuple);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 8:&lt;/span&gt;
  File: &lt;code&gt;main.c&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;This, again gives us the same result, as before, however, reduces all boilerplate to a single &lt;code&gt;tuple&lt;/code&gt; call.
Let&amp;rsquo;s see what this expands to when we compile it with &lt;code&gt;gcc -E main.c&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; Tuple tuple = __extension__({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; size = 3;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem tmp[] = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                _Generic((42), &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;*: make_string, &lt;span style=&#34;font-weight:bold&#34;&gt;double&lt;/span&gt;: make_double, &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;: make_long, &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt;: make_long)(42),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                _Generic((22./7), &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;*: make_string, &lt;span style=&#34;font-weight:bold&#34;&gt;double&lt;/span&gt;: make_double, &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;: make_long, &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt;: make_long)(22./7),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                _Generic((&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;foobar&amp;#34;&lt;/span&gt;), &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;*: make_string, &lt;span style=&#34;font-weight:bold&#34;&gt;double&lt;/span&gt;: make_double, &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;: make_long, &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt;: make_long)(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;foobar&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem * arr = malloc(&lt;span style=&#34;font-weight:bold&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; TupleItem) * size);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; size; i++)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                arr[i] = tmp[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; Tuple){.tuple = arr, .size = size};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pprint_tuple(&amp;amp;tuple);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As I&amp;rsquo;ve mentioned, &lt;code&gt;_Generic&lt;/code&gt; will go away at compilation time and will leave invocations of respecting functions.
We&amp;rsquo;ve achieved our goal, but this solution has some problems.&lt;/p&gt;
&lt;p&gt;First, obviously &lt;code&gt;_Generic&lt;/code&gt; and &lt;code&gt;({})&lt;/code&gt; may not be available in a certain compiler, or when using an older C standard.
So the portability of this code is not very good.
Another problem is that the definitions inside the &lt;code&gt;({})&lt;/code&gt; block may shadow outer definitions.
This may not be a problem in this example, but a thing to remember.
A compiler actually will warn you about it.&lt;/p&gt;
&lt;h2 id=&#34;take-2-struct-generation&#34;&gt;Take 2 - struct generation&lt;/h2&gt;
&lt;p&gt;But then it hit me.
Why do we even need an array here?
All we really needed was this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; Tuple {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; _0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;double&lt;/span&gt; _1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;* _2;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define tuple(...) (struct Tuple){__VA_ARGS__}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; Tuple vaiv = tuple(42, 22./7, &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;foo bar&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{%d, %f, %s}&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;, vaiv._0, vaiv._1, vaiv._2);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is still a tuple, &lt;em&gt;right&lt;/em&gt;?
Well, some languages have this kind of tuple access, so I think it&amp;rsquo;s OK.
Examples would be &lt;a href=&#34;https://doc.rust-lang.org/std/primitive.tuple.html&#34; target=&#34;_blank&#34;&gt;Rust&lt;/a&gt; and &lt;a href=&#34;https://ziglang.org/documentation/0.9.1/#toc-Anonymous-Struct-Literals&#34; target=&#34;_blank&#34;&gt;Zig&lt;/a&gt;.
Rust has this kind of field access, and Zig just uses anonymous structs with integer fields.
So the only challenge here is to generate such a struct.
Fortunately, the process is extremely similar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#pragma once
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define TYPE_DISPATCH(X, N) X _##N;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define VALUE_DISPATCH(X, N) ._##N = (X),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define EXPAND(X) X
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define CONCATENATE(A, B) CONCATENATE1(A, B)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define CONCATENATE1(A, B) CONCATENATE2(A, B)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define CONCATENATE2(A, B) A##B
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define FOR_EACH_0(WHAT, X) WHAT(X, 0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define FOR_EACH_1(WHAT, X, ...) WHAT(X, 1) FOR_EACH_0(WHAT, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define FOR_EACH_2(WHAT, X, ...) WHAT(X, 2) FOR_EACH_1(WHAT, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define FOR_EACH_3(WHAT, X, ...) WHAT(X, 3) FOR_EACH_2(WHAT, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// define more if you need more elements in the tuple
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define TUPLE_EACH_NARG_(...) CHOOSER(__VA_ARGS__, 3, 2, 1, 0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define CHOOSER(_0, _1, _2, _3, N, ...) N
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define REVERSE_1(X) X
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define REVERSE_2(X, Y) Y, X
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define REVERSE_3(X, ...) EXPAND(REVERSE_2(__VA_ARGS__)), X
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define REVERSE_4(X, ...) EXPAND(REVERSE_3(__VA_ARGS__)), X
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define REVERSE_(N, ...) EXPAND(REVERSE_##N(__VA_ARGS__))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define REVERSE(N, ...) REVERSE_(N, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// also define more if you need more elements
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define TUPLE_EACH_(N, WHAT, ...) CONCATENATE(FOR_EACH_, N)(WHAT, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define TUPLE_(WHAT, ...) \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    TUPLE_EACH_(TUPLE_EACH_NARG_(__VA_ARGS__), WHAT, __VA_ARGS__)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define tuple(...)                                                     \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    {                                                                  \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        .len = TUPLE_EACH_NARG_(_, __VA_ARGS__),                       \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        TUPLE_(VALUE_DISPATCH,                                         \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;               REVERSE(TUPLE_EACH_NARG_(_, __VA_ARGS__), __VA_ARGS__)) \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define deftuple(...)                                                  \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    struct {                                                           \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        int len;                                                       \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        TUPLE_(TYPE_DISPATCH,                                          \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;               REVERSE(TUPLE_EACH_NARG_(_, __VA_ARGS__), __VA_ARGS__)) \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 9:&lt;/span&gt;
  File: &lt;code&gt;tuple.h&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;rsquo;ve limited the macro to support only four-element tuples, as it can be quite ridiculous with more elements than that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;#34;tuple.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deftuple(&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;, &lt;span style=&#34;font-weight:bold&#34;&gt;double&lt;/span&gt;, &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;*) vaiv = tuple(42, 22./7, &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;foo bar&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{%d, %f, %s}&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;, vaiv._0, vaiv._1, vaiv._2);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 10:&lt;/span&gt;
  File: &lt;code&gt;main.c&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;The tricky part here was to realize how to reverse the argument list.
The problem here was that our &lt;code&gt;FOR_EACH_&lt;/code&gt; macro goes forward the argument list, but backward in the sense that it starts at some arbitrary &lt;code&gt;FOR_EACH_&amp;lt;N&amp;gt;&lt;/code&gt; and continues until it reaches &lt;code&gt;FOR_EACH_0&lt;/code&gt;.
So when generating for the struct fields, I had to reverse the arguments before the generation, so the &lt;code&gt;_&amp;lt;N&amp;gt;&lt;/code&gt; fields matched.
For a better understanding, here&amp;rsquo;s the result of running only the preprocessor with &lt;code&gt;gcc -E main.c&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; { &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; len; &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;* _2; &lt;span style=&#34;font-weight:bold&#34;&gt;double&lt;/span&gt; _1; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; _0; } vaiv = { .len = 3, ._2 = (&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;foo bar&amp;#34;&lt;/span&gt;), ._1 = (22./7), ._0 = (42), };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;{%d, %f, %s}&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;, vaiv._0, vaiv._1, vaiv._2);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that while we&amp;rsquo;ve defined our tuple as &lt;code&gt;(int, double, char*)&lt;/code&gt;, the order in the struct is in reverse: &lt;code&gt;{int len; char* _2; double _1; int _0;}&lt;/code&gt;.
And because of that we now can use the initializer-list, and still access args in the correct order.
The same happens when we create the tuple itself: &lt;code&gt;tuple(42, 22./7, &amp;quot;foo bar&amp;quot;)&lt;/code&gt; becomes &lt;code&gt;{.len=3, ._2 = (&amp;quot;foo bar&amp;quot;), ._1 = (22./7), ._0 = (42),}&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;So here are two ways of creating &lt;em&gt;generic&lt;/em&gt; tuples in C.
I understand that this may be not the most practical or even optimal way of creating tuples in C, but the last one is appealing to me because it&amp;rsquo;s a fully compile-time thing.
And it was a nice puzzle, especially after two years of not using C almost at all.&lt;/p&gt;
&lt;p&gt;I like the second solution more because it&amp;rsquo;s just an &lt;code&gt;tuple.h&lt;/code&gt; file, without &lt;code&gt;tuple.c&lt;/code&gt; counterpart as with the first solution.
And unlike the first solution, you don&amp;rsquo;t need to modify any code to use it, only if you need a tuple with more arguments than supported by macros, but it&amp;rsquo;s a common thing in both solutions.
There&amp;rsquo;s probably a nicer way to generate such iterations, but I&amp;rsquo;m not familiar with this one.&lt;/p&gt;
&lt;p&gt;Though, unlike the first implementation, the second one doesn&amp;rsquo;t allow iteration over the tuple in any form, as it&amp;rsquo;s not really a sequence anymore, so the &lt;code&gt;len&lt;/code&gt; field may be a bit pointless.
In statically typed languages iteration over a tuple can be hard, because each element can have a different type.
It was possible with the first implementation because we&amp;rsquo;ve explicitly stored tuple item type in the tuple item itself, so we had to implement &amp;ldquo;generic&amp;rdquo; functions that would know how to work with a given element, but the dispatch happened at runtime.
Rust, for example, doesn&amp;rsquo;t allow iteration over tuples, as it doesn&amp;rsquo;t even guarantee the order of elements in the tuple.
&lt;a href=&#34;https://ziglang.org/&#34; target=&#34;_blank&#34;&gt;Zig&lt;/a&gt; allows iteration, but only at compile-time, as far as I understand it.&lt;/p&gt;
&lt;p&gt;Speaking of Zig, right now I&amp;rsquo;m learning it, and it actually brings me a lot of memories about learning C, and overall feels great.
In this blog, I&amp;rsquo;ve &lt;a href=&#34;https://andreyor.st/posts/2020-04-06-c-needs-a-better-syntax/&#34;&gt;already ranted about C&lt;/a&gt; mostly its macros and syntax, and I still think most things I&amp;rsquo;ve said are valid.
E.g. the tuple macro above suffers from the requirement to &lt;code&gt;typedef&lt;/code&gt; compound types, like structs or &lt;code&gt;long type&lt;/code&gt; things.&lt;/p&gt;
&lt;p&gt;And learning Zig now feels like learning a better C.
A lot of patterns are probably doable in both languages, given how minimalist both of those are, but Zig almost always feels much clearer.&lt;/p&gt;
&lt;p&gt;Consider an amateur attempt at creating &lt;code&gt;Cons&lt;/code&gt; cells in Zig, and then doing mostly the same thing in C via macros:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2022-03-15-generic-tuples-in-c/zig_vs_c.jpg&#34;
         alt=&#34;Figure 1: C on the left, Zig on the right&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 1: &lt;/span&gt;C on the left, Zig on the right&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;(Posted it as an image, because this post already has way too much code. I&amp;rsquo;ve described how this kind of generics works in &lt;a href=&#34;https://andreyor.st/posts/2020-04-06-c-needs-a-better-syntax/#macros&#34;&gt;Macros section&lt;/a&gt; of the already mentioned C rant.)&lt;/p&gt;
&lt;p&gt;Well, this is another approach to generic functions in C, and it&amp;rsquo;s not that hard to write such macros - just write it as an ordinary code, then select a type you need to be generic and make a few text substitutions with your editor of choice.
But while this is doable, and &lt;em&gt;works&lt;/em&gt;, my main point is that  Zig feels a lot more clear, and achieves the same thing, I believe via mostly the same ways.
Being more clear is an obvious benefit, and C code here has a nasty bug, kudos if you&amp;rsquo;ll manage to spot it in this macro mess.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m bringing Zig here, not because it has support for tuples or a more clear syntax but because even though C gets new standards, it still feels like it&amp;rsquo;s standing in place, and nothing really changes over the years.
And Zig, while young, has quite ambitious goals of both supporting C ABI and &lt;a href=&#34;https://ziglang.org/learn/overview/#zig-competes-with-c-instead-of-depending-on-it&#34; target=&#34;_blank&#34;&gt;competing with C without depending on it&lt;/a&gt;.
If you write in C, I encourage you to go and try Zig for a bit - it has a clear vision of a small system language.
Another interesting thing on the horizon is &lt;a href=&#34;https://drewdevault.com/2022/03/13/Why-am-I-working-in-private.html&#34; target=&#34;_blank&#34;&gt;Drew DeVault&amp;rsquo;s secret system language&lt;/a&gt;.
I have not yet looked at it, but from what I&amp;rsquo;ve read in the blog posts, it seems quite interesting.
We&amp;rsquo;ll see how it compares to Zig when it&amp;rsquo;ll becomes available.&lt;/p&gt;
&lt;p&gt;Going back to the main topic of this post, I think there are more robust ways of doing this.
Probably a lot of dynamically typed languages that are implemented in C are doing something like that, mainly for implementing a generic type to pass around.
I&amp;rsquo;m yet to try my solution in practice, and as I&amp;rsquo;ve mentioned, this probably won&amp;rsquo;t work in its current state.
But I hope it was at least an example of interesting use of C macros.
And now, in case I&amp;rsquo;ll forget how to do this macro iteration, I&amp;rsquo;ll have a place to look :)&lt;/p&gt;
&lt;div class=&#34;comment-link&#34;&gt; &lt;a href=&#34;mailto:%61%6e%64%72%65%79%6f%72%73%74%2b%62%6c%6f%67%40%67%6d%61%69%6c%2e%63%6f%6d?subject=Comment: Generic* tuples in C&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Comment via email&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 15 Mar 2022 21:03:00 +0300</pubDate>
    </item><item>
      <title>C Needs Better Syntax and Macros</title>
      <link>https://andreyor.st/posts/2020-04-06-c-needs-a-better-syntax/</link>
      <guid>https://andreyor.st/posts/2020-04-06-c-needs-a-better-syntax/</guid>
      <description>&lt;p&gt;Today I&amp;rsquo;ve decided that I want to write a little rant on the topic of language design.
Since I&amp;rsquo;m a C programmer, and I use it on a daily basis, I&amp;rsquo;ve had many thoughts about C syntax over the past few years.
I like C, and it is a good language, that defined modern operating systems, and software.
But I think that C still needs a better syntax and macro system.
Not because C syntax is inconvenient to use, but because the syntax is a tool of expression.
And macros can extend this concept even further.&lt;/p&gt;
&lt;p&gt;You know, we, programmers, use a programming &lt;strong&gt;language&lt;/strong&gt; to communicate with computers.
When people are communicating with other people, the language is constantly improved, by adding new constructions and removing inconvenient and old ones.
This helps language to be up with the current realities, and not die like, for example, the Latin language.
No one speaks Latin not because it is inconvenient, but because it is poor.
And C syntax is poor as well.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s have a little test.
Imagine that you&amp;rsquo;re a C compiler, I&amp;rsquo;ll give you the beginning of the line, and you will try to guess what is happening in it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; something&lt;span style=&#34;&#34;&gt;…&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What could it be?
This is certainly a declaration of something, but what exactly?
Maybe it is an integer variable declaration, like &lt;code&gt;int something = something_else;&lt;/code&gt;.
Or maybe it is function declaration, like &lt;code&gt;int something(something_else);&lt;/code&gt;.
Or maybe &lt;code&gt;something&lt;/code&gt; is actually a macro?
Then &lt;code&gt;something&lt;/code&gt; may actually be &lt;code&gt;something_else&lt;/code&gt;.
And don&amp;rsquo;t think that if you see &lt;code&gt;something(something_else);&lt;/code&gt; it always will be a function, because it can actually be a function-like macro that expands to whatever it likes to!
Ah, that also can be an array pointer - &lt;code&gt;int something[]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s no way to tell…
unless we look ahead.
Sure, it is not a problem for the compiler, and such things as functions, or arrays have obvious and well-known syntax.
In the case of macros, well, you can&amp;rsquo;t know without checking it yourself or using some sort of a tool that can show if the thing under the cursor is macros or not.
This may not be a problem for compilers, but for us, humans, this is an issue, because we see code, but can&amp;rsquo;t immediately see the connection between the code and what actually will happen.
This may seem like a minor issue, but when dealing with large codebases which use tons and tons of complex macros, it became really tedious.
Most of the time good tooling can help with that, but more certainty would be an improvement.&lt;/p&gt;
&lt;p&gt;Of course, we can complain all we want, so instead let&amp;rsquo;s discuss how to improve this.
I&amp;rsquo;ve programmed for more than 5 years in C at work, mostly writing bare metal software for SoC, so my interest lies in the niche of compiled/system languages.
I&amp;rsquo;ve also occasionally used C++ at work, seen some Java syntax, and recently got into Rust.
Rust is somewhat known as a language with quite ugly and verbose syntax, but I don&amp;rsquo;t think so, and its syntax improves much upon C and C++.
And I&amp;rsquo;m sorry C++ guys, but C++ syntax is pile of trash&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s compare the example code above with Rust variants for each of our guesses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Function:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;something&lt;/span&gt;&lt;span style=&#34;&#34;&gt;…&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Variable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; something&lt;span style=&#34;&#34;&gt;…&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pointer and array:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; something&lt;span style=&#34;&#34;&gt;…&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; something&lt;span style=&#34;&#34;&gt;…&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Uh oh, pointers and arrays are declared exactly how variables are, but that&amp;rsquo;s not a problem, because in Rust variables hold pointers, and type of the variable is specified &lt;strong&gt;after&lt;/strong&gt; variable name and before assignment.
So it is not an issue, because we know, that plain variable, array, pointer, hash-map, and everything else will have the same syntax.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Macro:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;something!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bang!
Macros always end with &lt;code&gt;!&lt;/code&gt;, which makes those easy to see and expect something to happen.
This means, that Rust covers 3 out of four complaints I had, and the remaining one is meaningful in terms of the language itself, so this is kind of 4 out of 4.
Though these are not the only problems with C syntax, so let&amp;rsquo;s dive more in-depth.&lt;/p&gt;
&lt;h2 id=&#34;type-cyntax&#34;&gt;Type &lt;em&gt;Cyntax&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s discuss the type syntax.
C features these default types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;char&lt;/code&gt; - for 8 bit sized data.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;short&lt;/code&gt; - for at least 16 bit sized data.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int&lt;/code&gt; - for at least 16 bit sized data.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;long&lt;/code&gt; - for at least 32 bit sized data.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;float&lt;/code&gt; - for single precision floating point data.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;double&lt;/code&gt; - for double precision floating point data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So far so good.
Well, sizes are &lt;em&gt;bit&lt;/em&gt; strange, like &lt;code&gt;int&lt;/code&gt; and &lt;code&gt;short&lt;/code&gt; are both at least 16 bit, but this is architecture dependent, and that&amp;rsquo;s another problem and another topic.
There&amp;rsquo;s one more type that exists but doesn&amp;rsquo;t quite fit the previous list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;long long&lt;/code&gt; - for at least 64bit sized data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Did you notice that?
No?
Then let me point it out.
It uses two words to describe a single idea while previously we had single-worded types, that represented a single concept.&lt;/p&gt;
&lt;p&gt;Well, actually all types that were listed above can use two words, e.g. &lt;code&gt;unsigned char&lt;/code&gt;, but this describes that this very type is not only for 8bit but also has no sign.
There are two concepts that are described with two words.
Not for &lt;code&gt;unsigned long long&lt;/code&gt; though.&lt;/p&gt;
&lt;p&gt;To be honest, all those types except &lt;code&gt;int&lt;/code&gt;, and &lt;code&gt;char&lt;/code&gt;, can be written using two words that specify length.
We can rewrite the previous list as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;char&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;short int&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;long int&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It makes sense for &lt;code&gt;char&lt;/code&gt; not to be &lt;code&gt;short&lt;/code&gt; or &lt;code&gt;long&lt;/code&gt; because it is widely used to store ASCII characters, which need 256 variants and this always needs 8bits.
This also makes sense for &lt;code&gt;int&lt;/code&gt; to be &lt;code&gt;short&lt;/code&gt; or &lt;code&gt;long&lt;/code&gt;, to fit 16 or 32 bits.
&lt;strong&gt;Not for &lt;code&gt;long long&lt;/code&gt; though!&lt;/strong&gt; See:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;long long int&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Again three words to describe the concept of two.
Anyway, I&amp;rsquo;m nitpicking because there&amp;rsquo;s a better approach available.
And most C programmers use it, I believe:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;signed&lt;/span&gt;   &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; int64;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; uint64;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And we&amp;rsquo;re now describing the whole concept with a single word: &lt;code&gt;uint64&lt;/code&gt;.
Look how easy it is now to get everything we need to know.
Size?
&lt;code&gt;64&lt;/code&gt;.
Has sign?
Check for &lt;code&gt;u&lt;/code&gt; at the start of the word.
This can be repeated for all other types:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;signed&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;   int8;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt; uint8;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;signed&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;short&lt;/span&gt;   int16;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;short&lt;/span&gt; uint16;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;signed&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;   int32;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; uint32;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;signed&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt;   int64;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt; uint64;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice the common pattern?
&lt;code&gt;int&lt;/code&gt; repeats in every type name we defined.
Rust went further and removed it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;i8&lt;/code&gt;, &lt;code&gt;u8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;i16&lt;/code&gt;, &lt;code&gt;u16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;i32&lt;/code&gt;, &lt;code&gt;u32&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;i64&lt;/code&gt;, &lt;code&gt;u64&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&amp;rsquo;t think that &lt;code&gt;i&lt;/code&gt; for signed is the best choice, but I&amp;rsquo;m fine with this.
And types are now very consistent and short.
Although compound multi-word types have one advantage over a predefined set of types because we have more control over whether we want our type to be signed or long, this is also error-prone, because someone may assume that &lt;code&gt;long long long int&lt;/code&gt; is a valid type, while it&amp;rsquo;s not.&lt;/p&gt;
&lt;p&gt;While we&amp;rsquo;re on types, I think that defining types before objects have little sense too.
In Rust type is specified after object name and it reads well, e.g.:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt;    name  :  &lt;span style=&#34;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;str&lt;/span&gt;       =       &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;John&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// |      |     |  |          |       |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// define thing of some type, holding something
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Compared to C:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt; *       name   =       &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;John&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// |    |       |      |       |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// type pointer thing, holding something
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And it is known practice in C to read declarations in the opposite direction, e.g. &lt;code&gt;name&lt;/code&gt; is &lt;code&gt;pointer&lt;/code&gt; to &lt;code&gt;char&lt;/code&gt;.
There&amp;rsquo;s also a &lt;em&gt;clockwise spiral reading rule&lt;/em&gt; that can be applied to functions and arrays:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-04-06-c-needs-a-better-syntax-and-macros/clockwise-array.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;code&gt;str&lt;/code&gt; is an &lt;code&gt;array&lt;/code&gt; of &lt;code&gt;10&lt;/code&gt; &lt;code&gt;pointers&lt;/code&gt; to a &lt;code&gt;char&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Although for the function pointer it seems that counterclockwise fits better:&lt;/p&gt;
&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-04-06-c-needs-a-better-syntax-and-macros/clockwise-function.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;code&gt;fp&lt;/code&gt; is a &lt;code&gt;pointer&lt;/code&gt; to a &lt;code&gt;function&lt;/code&gt; that accepts an &lt;code&gt;int&lt;/code&gt; and a &lt;code&gt;pointer&lt;/code&gt; to a &lt;code&gt;char&lt;/code&gt; and returning a &lt;code&gt;pointer&lt;/code&gt; to a &lt;code&gt;char&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;English is not &lt;a href=&#34;https://en.wikipedia.org/wiki/Right-to-left&#34; target=&#34;_blank&#34;&gt;RTL&lt;/a&gt;, why would we need that stuff in C?
Rust uses one more construct to define this and it is &lt;code&gt;:&lt;/code&gt;, which in C is used in &lt;code&gt;?:&lt;/code&gt; operator and in &lt;code&gt;case&lt;/code&gt; statements.
And, &lt;code&gt;case _:&lt;/code&gt; is a well-defined syntax, since &lt;code&gt;case&lt;/code&gt; is a keyword, so we can&amp;rsquo;t mix it up with type annotation.
&lt;code&gt;?:&lt;/code&gt; is used only after &lt;code&gt;=&lt;/code&gt;, so it&amp;rsquo;s also well defined:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          a     :  &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;   =       42;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;//        |     |  |     |       |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// define thing of type, holding 42
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;font-weight:bold&#34;&gt;case&lt;/span&gt; 0 :           a     :  &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;  = cond  ?      1 :  0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// |    | |           |     |  |    |       |      | |  |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// case 0 then define thing of type holding either 1 or 0, depending on cond
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Case with &lt;code&gt;case&lt;/code&gt; is like an &lt;em&gt;edge case&lt;/em&gt;, and quite uncommon even with current syntax, so I don&amp;rsquo;t think that this is a problem.
There is another use for &lt;code&gt;:&lt;/code&gt;, which I&amp;rsquo;ve never actually seen in my practice, that it can be used for bit size indication instructs, so unfortunately we can&amp;rsquo;t use it for types in the same way how we use &lt;code&gt;*&lt;/code&gt; both for pointers and multiplication:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; item {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; f : 28; &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// 28-bit field
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But this just means that for bit fields we can specify that it is valid to use &lt;code&gt;:&lt;/code&gt; for the second time:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; item {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f: &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; : 28;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just like that in official syntax &lt;code&gt;:&lt;/code&gt; as a bit-field specifier is the only valid syntax in &lt;code&gt;struct&lt;/code&gt;, the second use of &lt;code&gt;:&lt;/code&gt; could be also only valid in &lt;code&gt;struct&lt;/code&gt;.
This way we could use uniform syntax for type declaration.
Here&amp;rsquo;s a side-by-side comparison of the standard syntax, and what I think is a better alternative:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; my_IEEE754 {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;union&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; sf_t {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; fraction : 23;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; exp : 8;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; sign : 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } sf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;float&lt;/span&gt; hf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } f;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} my_float;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; argc, &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt; * argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    my_float pi = { .f.hf = 3.1415f };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now with imaginary syntax.
I&amp;rsquo;ve kept those constructs that I&amp;rsquo;m fine with, such as &lt;code&gt;struct&lt;/code&gt; initializer, and I also changed &lt;code&gt;char*[]&lt;/code&gt; to &lt;code&gt;[*char]&lt;/code&gt; so it could be read as &lt;code&gt;array&lt;/code&gt; of &lt;code&gt;pointer&lt;/code&gt; to &lt;code&gt;char&lt;/code&gt; without falling back RTL:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; my_IEEE754 {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f: &lt;span style=&#34;font-weight:bold&#34;&gt;union&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sf: &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; sf_t {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            fraction: &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; : 23;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            exp: &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; : 8;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sign: &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; : 1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        hf: &lt;span style=&#34;font-weight:bold&#34;&gt;float&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} my_float;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;main(argc: &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;, argv: [*&lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pi: my_float = { .f.hf = 3.1415f }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I understand that not everyone will agree with me here.
I also prefer trailing return type, as in Rust, and even though &lt;code&gt;-&amp;gt;&lt;/code&gt; is reserved for accessing &lt;code&gt;struct&lt;/code&gt; fields from pointers, which is also true for C++11, C++11 still can use it for specifying the return type of the function, so I think C also could do that.&lt;/p&gt;
&lt;p&gt;Although it seems that without a type at the beginning it&amp;rsquo;s harder to tell when we&amp;rsquo;re declaring something, and when we using a defined variable, Rust uses a special keyword &lt;code&gt;let&lt;/code&gt;, since types can be omitted:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;mut&lt;/span&gt; a = 42; &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// declaration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;        a = 27; &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// later use
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, in C we always specify type when declaring a variable so &lt;code&gt;let&lt;/code&gt; can be omitted:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a: &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; = 42; &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// declaration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;     a = 27; &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// usage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pointers in C also have one interesting error-prone syntax case.
Look at this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; * a, b;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-04-06-c-needs-a-better-syntax-and-macros/double-clockwise.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;If we read this right to left or use clockwise rule, we will see, that &lt;code&gt;b&lt;/code&gt; is of type &lt;code&gt;int&lt;/code&gt; and &lt;code&gt;a&lt;/code&gt; is a &lt;code&gt;pointer&lt;/code&gt; to &lt;code&gt;int&lt;/code&gt;.
But during my practice, I&amp;rsquo;ve seen many cases when other programmers read this left to right, e.g. &amp;ldquo;declaration of the integer pointers &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt;&amp;rdquo;.
Unless you really know what&amp;rsquo;s going on, you can spend a lot of time wondering why your code misbehaves.
And one reason for it to misbehave could be that someone forgot to add another asterisk:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; * a, * b;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure class=&#34;invertable&#34;&gt;&lt;img src=&#34;https://andreyor.st/2020-04-06-c-needs-a-better-syntax-and-macros/double-pointer-clockwise.svg&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Because of this problem, there are three different conventions on where to place the asterisk - near the type, near the variable, or in between.
I, personally use the last one, as you can see, but this code can also be rewritten in this form:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;* a, * b; &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// quite ugly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; *a, *b;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// more concise
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first one is quite ugly, and error-prone, because it may seem, that we&amp;rsquo;ve specified &lt;code&gt;int*&lt;/code&gt; type and all objects will have that type.
And the second asterisk looks really out of place because of that.
The second one is a bit better, but I think that it fails to define an idea that we&amp;rsquo;re pointing to type.
I rarely write such constructions, because it gets messy when you specify values, so I split this into two lines:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; * a; &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;// easy to refactor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; * b;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is less error-prone and easier to refactor.
And I think that I would rework this to be&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a: *&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;b: *&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There&amp;rsquo;s another interesting moment.
C supports multi-word types, but users can declare only single-word types.
This is a kinda double standard for me.
And even if we could create multi-word types would be a total mess!
And multi-word types ruin one major aspect, and it is used in macros.&lt;/p&gt;
&lt;h2 id=&#34;macros&#34;&gt;Macros&lt;/h2&gt;
&lt;p&gt;Macros in C are not like macros in languages that feature macro systems as part of the language, like Lisp, or even Rust.
In C macros are &lt;em&gt;simple&lt;/em&gt; text substitutions, and expanded before compilation by using a preprocessor.
So if you will write &lt;code&gt;#define five 5&lt;/code&gt; and then use &lt;code&gt;five&lt;/code&gt; in several places, right before compilation, preprocessor will substitute &lt;code&gt;five&lt;/code&gt; with &lt;code&gt;5&lt;/code&gt;.
&lt;code&gt;five&lt;/code&gt; is not a variable, but simply a placeholder for specific data.
This is the most simple macro, but that&amp;rsquo;s not all that a preprocessor offers.
We can use many things like &lt;code&gt;#if&lt;/code&gt;, &lt;code&gt;#ifndef&lt;/code&gt;, &lt;code&gt;#else&lt;/code&gt; e.t.c.
to alter how our source code will be compiled.
And this is a source of some problems as well.&lt;/p&gt;
&lt;p&gt;The first problem we stated was that macros can mimic the code too well.
Because macros in C differ from actual C code and are a foreign thing, there should be a way of knowing what is a macro.
The other problem with C macros is that those are text &lt;em&gt;substitutions&lt;/em&gt;.
Consider the following macro:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define vec(T)          \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    struct vector_##T { \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        T * data;       \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        size_t size;    \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can use such a pattern to create &lt;a href=&#34;https://en.wikipedia.org/wiki/Generic_programming&#34; target=&#34;_blank&#34;&gt;generics&lt;/a&gt; or templates if you&amp;rsquo;re familiar with C++.
This macro then can be used like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vec(&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt;) vector_of_ints = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vec(&lt;span style=&#34;font-weight:bold&#34;&gt;float&lt;/span&gt;) vector_of_floats = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To understand what&amp;rsquo;s going on here, let&amp;rsquo;s substitute the macro call by hand.
First, we substitute &lt;code&gt;vec(int)&lt;/code&gt;, with macro body and remember &lt;code&gt;int&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; vector_&lt;span style=&#34;&#34;&gt;##&lt;/span&gt;T {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    T * data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    size_t size;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} vector_of_ints = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We&amp;rsquo;ve passed &lt;code&gt;int&lt;/code&gt; as a parameter to our macro so we substitute T with it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; vector_&lt;span style=&#34;&#34;&gt;##&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; * data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    size_t size;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} vector_of_ints = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, concatenation will happen at each &lt;code&gt;##&lt;/code&gt;, producing &lt;code&gt;vector_int&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; vector_int {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; * data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    size_t size;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} vector_of_ints = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At this point, we&amp;rsquo;ve got macro fully expanded, and that&amp;rsquo;s how &lt;code&gt;main&lt;/code&gt; function looks:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; vector_int {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; * data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        size_t size;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } vector_of_ints = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vec(&lt;span style=&#34;font-weight:bold&#34;&gt;float&lt;/span&gt;) vector_of_floats = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then this repeats to &lt;code&gt;vec(float)&lt;/code&gt;, producing the final code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; vector_int {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; * data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        size_t size;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } vector_of_ints = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;struct&lt;/span&gt; vector_float {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;font-weight:bold&#34;&gt;float&lt;/span&gt; * data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        size_t size;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } vector_of_floats = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pretty cool, right?
&lt;strong&gt;Wrong&lt;/strong&gt;.
We can&amp;rsquo;t do the same with &lt;code&gt;long long&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vec(&lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;long&lt;/span&gt;) vector_of_long_longs = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because &lt;code&gt;vector_##long long&lt;/code&gt; will produce &lt;code&gt;vector_long long&lt;/code&gt;, and we can&amp;rsquo;t have multi-word user types.
We can fix this by creating &lt;code&gt;typedef&lt;/code&gt;, but this means that we have to create &lt;code&gt;typedef&lt;/code&gt; for any type that we want to pass into such macros.
Meaning that the pointers also gonna need &lt;code&gt;typedefs&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;char&lt;/span&gt; * string;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vec(string) vector_of_strings = { .data = &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;NULL&lt;/span&gt;, .size = 0 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is one side of the problem.
The other side is that we&amp;rsquo;re operating with &lt;strong&gt;text&lt;/strong&gt;, not &lt;strong&gt;AST&lt;/strong&gt;.
To understand the difference let&amp;rsquo;s look at some Lisp macros, for instance, Clojure &lt;code&gt;time&lt;/code&gt; macro:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;defmacro &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;expr&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  `(&lt;span style=&#34;font-weight:bold&#34;&gt;let &lt;/span&gt;[&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;start#&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;. &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;System&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;nanoTime&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;ret#&lt;/span&gt; ~&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;expr&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;prn &lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;str &lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Elapsed time: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;/ &lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;double &lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;- &lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;. &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;System&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;nanoTime&lt;/span&gt;)) &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;start#&lt;/span&gt;)) 1000000.0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34; msecs&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;ret#&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m not going to teach you Lisp here, but still, let&amp;rsquo;s quickly understand what&amp;rsquo;s going on here.&lt;/p&gt;
&lt;p&gt;This macro does three things, first, it creates local binding &lt;code&gt;start#&lt;/code&gt; (&lt;code&gt;#&lt;/code&gt; will generate a unique suffix for the name), which will hold current system time in nanoseconds, creates local binding &lt;code&gt;ret#&lt;/code&gt;, that holds the result of an expression that we pass to &lt;code&gt;time&lt;/code&gt; and then prints line which shows the amount of &lt;code&gt;msecs&lt;/code&gt; that it took to evaluate the expression.
In the end, the &lt;code&gt;ret#&lt;/code&gt; is returned out of this macro.&lt;/p&gt;
&lt;p&gt;To understand this, let&amp;rsquo;s expand macro in this expression &lt;code&gt;(time (+ 1 2 3)&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;let*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;start1&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;. &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;System&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;nanoTime&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;ret1&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+ &lt;/span&gt;1 2 3)] &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;;; our sum expression&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;prn &lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;str &lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Elapsed: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;/ &lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;double &lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;- &lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;. &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;System&lt;/span&gt; (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;nanoTime&lt;/span&gt;)) &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;start1&lt;/span&gt;)) 1000000.0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34; msecs&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;ret1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So what macro did is, took the given AST, took &lt;code&gt;(+ 1 2 3)&lt;/code&gt; expression out of it, and generated a new AST, where this expression is used in &lt;code&gt;let*&lt;/code&gt; form, and the result is returned after time is measured.
It&amp;rsquo;s a simple macro, but it shows some neat things about Lisp macros.
Of course, it doesn&amp;rsquo;t represent Lisp macro system as a whole, but the general idea of Lisp macros is that you take one AST and change it to produce another AST at compile time.
And you need to understand that we did not manipulate text here, but the code itself.&lt;/p&gt;
&lt;p&gt;This macro is simple enough, so let&amp;rsquo;s write it in C:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;lt;time.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define time(code)                                           \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    __extension__({                                          \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        clock_t _begin      = clock();                       \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        __typeof(code) _res = __extension__({ code; });      \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        printf(&amp;#34;Elapsed: %g sec.\n&amp;#34;,                         \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;               (double)(clock() - _begin) / CLOCKS_PER_SEC); \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        _res;                                                \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;%d&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;, time(1 + 2 + 3));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sure it works, and it uses some compile time magic, like &lt;code&gt;__typeof&lt;/code&gt;, and GCC statement expression extension &lt;code&gt;__extension__({ … })&lt;/code&gt;, but in the end this is still textual work.
It will fail if we can&amp;rsquo;t get &lt;code&gt;__typeof&lt;/code&gt; correctly, for example, if we want to measure our for loop:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;time(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;volatile&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; i = 0; i &amp;lt; 0x1000; i++) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        printf(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;%d&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;, i);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will error, because &lt;code&gt;for&lt;/code&gt; has no type.
The problem is that we can&amp;rsquo;t return something if there&amp;rsquo;s nothing to return.
If we could analyze AST and produce valid code it would work.&lt;/p&gt;
&lt;p&gt;Another example of a C macro, that disables the evaluation of code is this &lt;code&gt;log&lt;/code&gt; macro.
The idea here is that the function, that we pass to &lt;code&gt;log&lt;/code&gt; may be slow, because it needs to get a huge amount of data, so we need a way to disable logging while still keeping all of our code.
Before looking at C, here&amp;rsquo;s the Ruby variant:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$debug = &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;log&lt;/span&gt;(&amp;amp;code)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; $debug
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $stderr.puts code.yield
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log {&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;message: &lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;#{&lt;/span&gt;expensive_logger&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So the idea here is that we&amp;rsquo;re passing a function, and it will be evaluated only if &lt;code&gt;$debug&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt;.
Here&amp;rsquo;s the C version:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;lt;stdbool.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;bool&lt;/span&gt; debug &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define log(fmt, ...)                          \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    do {                                       \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        if (debug)                             \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;            fprintf(stderr, fmt, __VA_ARGS__); \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    } while (0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; main(&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;message: %s&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;, expensive_logger());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we can see &lt;code&gt;…&lt;/code&gt; and &lt;code&gt;__VA_ARGS__&lt;/code&gt;.
These are special ways to pass and access a variadic amount of arguments to the macro.
This may seem like a little bit of AST manipulation, but again, this is just textual work, as &lt;code&gt;__VA_ARGS__&lt;/code&gt; expands to the sequence of arguments separated by commas, which means that we can&amp;rsquo;t do much with it.&lt;/p&gt;
&lt;p&gt;To understand why direct access to variadic arguments can be needed in macros, let&amp;rsquo;s look at another more complex macro from Clojure - thread first macro &lt;code&gt;-&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;defmacro &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt; &amp;amp; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;forms&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;font-weight:bold&#34;&gt;loop &lt;/span&gt;[&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt;, &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;forms&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;forms&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;font-weight:bold&#34;&gt;if &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;forms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;font-weight:bold&#34;&gt;let &lt;/span&gt;[&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;form&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;first &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;forms&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;threaded&lt;/span&gt; (&lt;span style=&#34;font-weight:bold&#34;&gt;if &lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;seq? &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;form&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;with-meta &lt;/span&gt;`(~(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;first &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;form&lt;/span&gt;) ~&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt; ~@(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;next &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;form&lt;/span&gt;)) (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;meta &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;form&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;list &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;form&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt;))]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;recur&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;threaded&lt;/span&gt; (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;next &lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;forms&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;x&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a more complex macro, that transforms AST, as shown in the &lt;code&gt;time&lt;/code&gt; example, but in a different way.
To understand it, we have to see what form of code it takes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;-&amp;gt; &lt;/span&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+ &lt;/span&gt;2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;* &lt;/span&gt;3 4)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;/ &lt;/span&gt;5))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And what code it produces:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;/ &lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;* &lt;/span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;+ &lt;/span&gt;1 2) 3 4) 5)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What essentially happens here is, that we pass list of expressions to &lt;code&gt;-&amp;gt;&lt;/code&gt;, which is &lt;code&gt;(1 (+ 2) (* 3 4) (/ 5))&lt;/code&gt; (lists in Lisp are delimited with parentheses), then we take first out, which is &lt;code&gt;1&lt;/code&gt;, and put it to the second position in &lt;code&gt;(+ 2)&lt;/code&gt; thus creating &lt;code&gt;(+ 1 2)&lt;/code&gt;.
Then we repeat it until we produce the final expression.
Here&amp;rsquo;s a table of steps, where &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;form&lt;/code&gt;, and &lt;code&gt;forms&lt;/code&gt; illustrate the values that these variables are holding in the macro above at each step of the &lt;code&gt;loop&lt;/code&gt;.
When &lt;code&gt;form&lt;/code&gt; turns empty, we return &lt;code&gt;x&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;x&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;form&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;forms&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(+ 2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;((* 3 4) (/ 5))&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(+ 1 2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(* 3 4)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;((/ 5))&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(* (+ 1 2) 3 4)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;(/ 5)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(/ (* (+ 1 2) 3 4) 5)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;What&amp;rsquo;s interesting in this macro, and in Lisp in general, is that your code &lt;strong&gt;is&lt;/strong&gt; your AST.
This means that you can take it and change it however you want to, with the language itself.
There are no other facilities for this, but those you use when you write regular code.
This is not suitable for C, because the relationship between syntax and AST is not 1 to 1 as in Lisp, so we have to use preprocessors.&lt;/p&gt;
&lt;p&gt;In the example above, we saw iteration over forms that we are passing to macro.
You can do something similar to that in C:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define first(x, ...) #x
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define rest(x, ...)  #__VA_ARGS__
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#define destructive(...)                              \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    do {                                              \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        printf(&amp;#34;first is: %s\n&amp;#34;, first(__VA_ARGS__)); \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;        printf(&amp;#34;rest are: %s\n&amp;#34;, rest(__VA_ARGS__));  \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;    } while (0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;font-weight:bold&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    destructive(1, 2, 3);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold&#34;&gt;return&lt;/span&gt; 0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because &lt;code&gt;__VA_ARGS__&lt;/code&gt; is just a comma-separated list of arguments, we can pass it to the macro, which takes 1 explicit argument &lt;code&gt;x&lt;/code&gt; and a variadic amount of rest arguments.
The example above converts arguments to strings, but you can spot the general idea.
Executing this code will print:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;first is: 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rest are: 2, 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But this is not really useful in the context of the language, because there&amp;rsquo;s no way to continuously iterate over such lists of arguments without defining a finite amount of iterator macros for a given amount of maximum possible arguments &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.
So such a thing as thread first macro isn&amp;rsquo;t really possible.
Which is a shame, because if there was a way to loop through macro at compile time something like &lt;code&gt;printf&lt;/code&gt; could easily be defined as a macro.
I&amp;rsquo;ve done printing macros based on this technique, which used Assembler primitive functions to display strings and numbers, and it performed way better than classic &lt;code&gt;printf&lt;/code&gt;.
This may seem like a strange point because usually performance of &lt;code&gt;printf&lt;/code&gt; is not something you really want to improve, but it depends on the task, and in my domain, a serious performance drop is noticeable when using &lt;code&gt;printf&lt;/code&gt; while working with bare metal emulation, which I do.
Also, Rust doesn&amp;rsquo;t support variadic arguments in functions, but its &lt;code&gt;println!&lt;/code&gt; macro surely does, because it is implemented in terms of iteration over the argument list and produces final printing code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;macro_rules! println {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    () =&amp;gt; (&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;$crate&lt;/span&gt;::print!(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;$($arg&lt;/span&gt;:&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;tt&lt;/span&gt;)*) =&amp;gt; ({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;$crate&lt;/span&gt;::io::_print(&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;$crate&lt;/span&gt;::format_args_nl!(&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;$($arg&lt;/span&gt;)*));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What I&amp;rsquo;m trying to say is that defining Domain Specific Language (DSL) for your project is &lt;strong&gt;good&lt;/strong&gt; both for you and your project.
It will make you more productive, and your code will be cleaner and usually much more compact and readable.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s the point of the macro system in the language - it changes language to fit your concrete problem.
Most C programmers say that macros are bad and should be avoided, but I think they are just scared of those because the implementation is really bad and you can make your code very tangled up with all &lt;code&gt;#if&lt;/code&gt; &lt;code&gt;#else&lt;/code&gt; &lt;code&gt;#endif&lt;/code&gt; stuff.
So what we can do with that?&lt;/p&gt;
&lt;h2 id=&#34;macro-processor-alternatives&#34;&gt;Macro processor alternatives&lt;/h2&gt;
&lt;p&gt;While we can&amp;rsquo;t really change C, it is still possible to fix some issues outside.
Let&amp;rsquo;s take a look at other macro implementations for C:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://insanecoding.blogspot.com/2011/10/stronger-cc-preprocesser.html&#34; target=&#34;_blank&#34;&gt;PHP&lt;/a&gt; - Use PHP to produce C code.
&lt;strong&gt;I dare you&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/interpreters/perlpp&#34; target=&#34;_blank&#34;&gt;Perl Preprocessor&lt;/a&gt; - use Perl to produce text or generate code.
Not strictly related to C, but can be used in C, as well as in any other language.
While I think that Perl is a fine choice, many people probably will not think alike.
But Perl is excellent for text processing, so I think it may be a good one for C macros.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/eudoxia0/cmacro&#34; target=&#34;_blank&#34;&gt;cmacro&lt;/a&gt; - macro processor for C written in Common Lisp.
This is the most interesting discovery so far.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.gnu.org/software/m4/&#34; target=&#34;_blank&#34;&gt;m4&lt;/a&gt; - GNU M4 macro processor.
It should improve the current state of the art in C macros, but I&amp;rsquo;ve never seen someone using it.&lt;/li&gt;
&lt;li&gt;Probably tons of other projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cmacro got my attention.
It seems to provide good AST manipulation primitives for C code and seems like a complete solution.
It also comes with a set of usable macros in a separate &lt;a href=&#34;https://github.com/eudoxia0/magma&#34; target=&#34;_blank&#34;&gt;package&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The problem is, that if you&amp;rsquo;re going to use any of the solutions listed above, you will add additional development dependency for your project.
This is not a huge issue but may cause problems or inconvenience for other developers that decided to contribute to your project.
That&amp;rsquo;s why built-in support for a good macro system is needed.&lt;/p&gt;
&lt;p&gt;While macro processors can be changed and integrated on a per-project basis, it&amp;rsquo;s not that easy to change syntax.
Yes, good macro preprocessors can extend syntax, as Cmacro does, but this will not solve all problems of C syntax, such as pointers to functions, that return pointer to function and take several pointers to functions, that take some arguments, as arguments.
Just try to write this, and any Lisp code will look like candy for you.
Look here&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; if you don&amp;rsquo;t want to waste your time, as I&amp;rsquo;ve wasted mine already.&lt;/p&gt;
&lt;h2 id=&#34;alternative-syntax&#34;&gt;Alternative syntax?&lt;/h2&gt;
&lt;p&gt;Although I&amp;rsquo;ve listed some different preprocessors that can fix or enhance the macro system in C, who said that we need to solve the problems of C syntax and macro system independently?&lt;/p&gt;
&lt;p&gt;Instead, we can create language, that transpires to valid C.
There are many languages that took this approach, and while I think that most of those change syntax too radically, it still may be good for us.
To name a few:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://gambitscheme.org/wiki/index.php/Main_Page&#34; target=&#34;_blank&#34;&gt;Gambit Scheme&lt;/a&gt; - CGambit is a compiler for Scheme, that generates portable C code.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nim-lang.org/&#34; target=&#34;_blank&#34;&gt;Nim&lt;/a&gt; - a language with Python-like syntax that can be compiled into C.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.gnome.org/Projects/Vala&#34; target=&#34;_blank&#34;&gt;Vala&lt;/a&gt; and &lt;a href=&#34;https://wiki.gnome.org/action/show/Projects/Genie&#34; target=&#34;_blank&#34;&gt;Genie&lt;/a&gt; - GNOME projects aimed toward C with improved syntax and support for classes through GObject.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So C as a host language is not a new idea, but which of these languages expand macro abilities, while still staying close to C syntax, just improving it in different areas?
None.
Vala is more like C++, but the macro system is not enhanced compared to C.
Genie and Nim are Python-like, though Nim got pretty good macro support because you actually can change AST.
Gambit also greatly enhances the macro system, because it is a Scheme.&lt;/p&gt;
&lt;p&gt;However all these languages, except, maybe, Vala, differ from C dramatically, so this may not be a good choice for everyone.
I&amp;rsquo;m sure that there may be a language that suits this better, but I&amp;rsquo;m unaware of it as of today.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s one more language though, that catches my eye as a C developer, and it is &lt;a href=&#34;https://github.com/zetzit/zz&#34; target=&#34;_blank&#34;&gt;ZZ&lt;/a&gt;.
It features Rust-like syntax, which is good for me, and procedural macros.
Though it&amp;rsquo;s not compiled down to C, it uses C ABI, so this may actually be a good point of transition of your codebase.
The language is quite young, and I did not use it personally, so I can&amp;rsquo;t really recommend it.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;To summarize my thoughts through this rant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C is an old language, its syntax is ugly, and it doesn&amp;rsquo;t have to be this way,&lt;/li&gt;
&lt;li&gt;Macro system in C is very lacking, and it doesn&amp;rsquo;t have to be this way either,&lt;/li&gt;
&lt;li&gt;There are solutions to the problem, but neither of those can fix everything without caveats.&lt;/li&gt;
&lt;li&gt;New languages, such as Rust and ZZ, are trying to fix problems of C, but the amount of legacy code written in C will not make the adoption easy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So in my opinion the best solution to all of this is for C developers to provide a new standard with improved syntax and macro system, and keep the name of the language, so new code could be written in it, while still keeping old code working by using compiler flag that specifies standard, &lt;em&gt;obviously&lt;/em&gt;.
While this is not optimal, and a lot of work, I think the future of C depends on this.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;C++ in my opinion has the worst syntax because it has so many of it for a single thing.
Like there&amp;rsquo;s too much different initializer syntax, two ways of specifying return types, a lot of implicit things that are syntactic sugar, and so on.
When I was trying to get into C++ it was a mess, like where do I use this initialization, and where do I use that?
For professional C++ developers that might be a good thing, but do we really need this kind of thing at all?
This is something like a balance between lines of code and amount of different syntax for the same thing, and I would prefer more lines of code wrapped into a macro that is used for this particular task I&amp;rsquo;m working on, and not several different syntax variants that are available all the time.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/a/1872506&#34; target=&#34;_blank&#34;&gt;This SO answer&lt;/a&gt; describes how to iterate over variadic arguments in C macro.
General idea is that you define a finite amount of reduction macros, and call one depending on the overall amount of parameters that were passed initially.
E.g. you define &lt;code&gt;helper1&lt;/code&gt;, &lt;code&gt;helper2&lt;/code&gt;, &lt;code&gt;helperN&lt;/code&gt;, and when you call your macro with &lt;code&gt;5&lt;/code&gt; arguments it will select &lt;code&gt;helper5&lt;/code&gt; and call it, &lt;code&gt;helper5&lt;/code&gt; then will call &lt;code&gt;helper4&lt;/code&gt;, and so on until it reaches the last one.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;code&gt;void(*f0(void(*f1)(void(*f2(void(*f3)(void)))(void))))(void(*f4(void(*f5)(void)))(void)) {return f1;}&lt;/code&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&#34;comment-link&#34;&gt; &lt;a href=&#34;mailto:%61%6e%64%72%65%79%6f%72%73%74%2b%62%6c%6f%67%40%67%6d%61%69%6c%2e%63%6f%6d?subject=Comment: C Needs Better Syntax and Macros&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Comment via email&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 06 Apr 2020 15:42:00 +0300</pubDate>
    </item>
  </channel>
</rss>
