You answered your own question: such <i>abstract</i> (not meaningless) variables make sense when the code is completely generic. Most code however is somewhere between generic and specific, literal values, and variable names should represent that semantically.<p>Also, I would even argue that <i>x</i> and <i>y</i> are <i>not</i> meaningless in this context. There&#x27;s a reason you didn&#x27;t write:<p><pre><code>    function flip(gnarf) {
      return function(t, m) {
        return gnarf(m, t);
      };
    }

    function compose(bip, boop) {
      return function(blep) {
        return bip(boop(blep));
      };
    }
</code></pre>
The sequences <i>{a, b, c}</i>, and <i>{i, j, k}</i>, <i>{m, n}</i>, <i>{p, q}</i>, <i>{x, y, z}</i> are all well-established &quot;abstract&quot; variable names that most of us remember from high school algebra, and all have different baggage and expectations:<p>- <i>a</i>, <i>b</i>, and <i>c</i> tend to be generic labels for things, not numbers<p>- <i>i</i>, <i>j</i>, and <i>k</i> are used for indices and tend to be natural numbers (or more rarely for complex numbers&#x2F;quaternions, where they are floats)<p>- <i>m</i> and <i>n</i> are used in matrices and also are used for natural numbers<p>- in maths, <i>p</i> and <i>q</i> are often fractions<p>- <i>x</i>, <i>y</i>, and <i>z</i> tend to represent coordinate systems and&#x2F;or floating numbers<p>We can combine this to create variable sequences, with subtly different meanings. For example: compare <i>(x1, y1)</i>, <i>(x2, y2)</i> with <i>(xa, ya)</i>, <i>(xb, yb)</i>. To me, if I see <i>foo(x1, y1, x2, y2)</i> that implies either top left, bottom right in an axis aligned bounding box, or perhaps the first point and the second point of a line or vector, or some other situation where the two points are somehow connected in one object or shape. Using <i>(xa,ya)</i> and <i>(xb, yb)</i> however suggests I&#x27;m dealing with two distinct points.