<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://quuxplusone.github.io/blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://quuxplusone.github.io/blog/" rel="alternate" type="text/html" /><updated>2026-08-13T13:40:22+00:00</updated><id>https://quuxplusone.github.io/blog/feed.xml</id><title type="html">Arthur O’Dwyer</title><subtitle>Stuff mostly about C++</subtitle><entry><title type="html">Colourfields</title><link href="https://quuxplusone.github.io/blog/2026/08/05/colourfields/" rel="alternate" type="text/html" title="Colourfields" /><published>2026-08-05T00:01:00+00:00</published><updated>2026-08-05T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/08/05/colourfields</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/08/05/colourfields/"><![CDATA[<p>Over on the (inexplicably login-walled) site “NewEnigma,”
Keith Austin <a href="https://www.newenigma.com/enigma/view/1277/Colourfields">writes</a>:</p>

<blockquote>
  <p>Draw a 4-by-4 grid. Colour each square red or blue. Select any square, S, and write 1 in it.
Then write 1 in every square you can reach from S by a series of moves, where each move is from
a square to an adjacent, horizontally, vertically, or diagonally, square of the same colour.</p>

  <p>Select any empty square, T, and write 2 in it. Then write 2 in every square you can reach from T
by a series of moves. Repeat this procedure for 3 and then 4 and so on until every square has a
number. The last number you write down is called the “score” for that colouring. If we imagine
the grid is the map of a farm, then you have divided the map into fields, one field for each number.</p>

  <p>(1) What is the largest score possible?</p>

  <p>(2) If we work with a 5-by-5 grid, what is the largest score possible?</p>
</blockquote>

<p>In brief: What is the maximum number of <em>queenwise-connected</em> monochromatic regions you
can make by coloring each square of an \(n\times n\) grid either red or blue? If we were asking about
rookwise-connected regions, the answer would obviously be \(n^2\). But queenwise-connected is
at least slightly less obvious!</p>

<p>For the 5-by-5 grid, the “obvious” answer is</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rBrBr
BBBBB
rBrBr
BBBBB
rBrBr
</code></pre></div></div>

<p>for a total of 10 regions. But the answer for 4×4 is not simply</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rBrB
BBBB
rBrB
BBBB
</code></pre></div></div>

<p>for a total of 5; you can in fact make 6 regions! (Once you’ve seen the trick it’s hard to unsee;
but I didn’t see it at first myself.)</p>

<p>Discussion on the <a href="https://groups.google.com/g/seqfan/c/ocmDmccx5mI/m/L3KqPGbiAgAJ">SeqFan</a> mailing list
tentatively produced the sequence: 1, 2, 5, 6, 10, 12, 17, 19, 26, (28?)… Here’s the pattern for
odd \(n\), and a <em>conjectured</em> pattern for all even \(n&gt;4\).</p>

<p><img src="/blog/images/2026-08-05-colourfields.svg" alt="" /></p>

<p>For odd \(n\): \(\lceil n/2\rceil^2 + 1\) regions.
For even \(n&gt;4\): \(\lceil n/2\rceil^2 + 3\) regions.</p>]]></content><author><name></name></author><category term="math" /><category term="puzzles" /><summary type="html"><![CDATA[Over on the (inexplicably login-walled) site "NewEnigma," Keith Austin [writes](https://www.newenigma.com/enigma/view/1277/Colourfields): > Draw a 4-by-4 grid. Colour each square red or blue. Select any square, S, and write 1 in it. > Then write 1 in every square you can reach from S by a series of moves, where each move is from > a square to an adjacent, horizontally, vertically, or diagonally, square of the same colour [...] In brief: What is the maximum number of _queenwise-connected_ monochromatic regions you can make by coloring each square of an $$n\times n$$ grid either red or blue?]]></summary></entry><entry><title type="html">Möbius-strip crosswords</title><link href="https://quuxplusone.github.io/blog/2026/08/04/mobius-crossword/" rel="alternate" type="text/html" title="Möbius-strip crosswords" /><published>2026-08-04T00:01:00+00:00</published><updated>2026-08-04T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/08/04/mobius-crossword</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/08/04/mobius-crossword/"><![CDATA[<p>Randall Rothenberg in the <em>New York Times</em> (1988-08-10) writes that although <a href="https://archive.is/K2Hw8">“Puzzle Makers Exchange Cross Words”</a>
about the fall of ERNE and ESNE and the rise of XEROX and PEACE PLAN, one
Robert Guilbert Sr.</p>

<blockquote>
  <p>was ignorant of the dispute two years ago when he developed a competitive crossword game
called Pago Pago and first became aware of crossword fans’ passion for the pastime.</p>
</blockquote>

<p>“Guilbert invented the crossword-based game Pago Pago” is repeated in
Thomas Frisbie, <a href="https://kolynychboss8.blogspot.com/2012/03/fan-passes-word-on-puzzle-hall-of-fame.html">“Fan passes word on puzzle hall of fame”</a>
(<em>Chicago Sun-Times</em>, 1988-08-14). (Thanks to Ben Zimmer for identifying the article!)
But that’s all I can find in print about Pago Pago.</p>

<p>Helene Hovanec’s article <a href="https://www.scribd.com/document/266289455/Robert-Guilbert-s-Crossword-Academy-by-Helene-Hovanec">“Robert Guilbert’s Crossword Academy”</a>
(<em>CROSSW RD</em>, Nov/Dec 1992) contains no text about Pago Pago, but does include this uncaptioned photograph
of Guilbert (1911–1990) hard at work:</p>

<p><img src="/blog/images/2026-08-04-guilbert.jpg" alt="" /></p>

<p>David Steinberg of the “Pre-Shortzian Puzzle Project” blog has mentioned Guilbert
<a href="http://www.preshortzianpuzzleproject.com/search/label/Robert%20Guilbert">several times</a>
in connection with Guilbert’s short-lived Crossword Academy, and even received in 2016
<a href="http://www.preshortzianpuzzleproject.com/2014/11/american-crossword-puzzle-academy.html">a very nice blog comment from Guilbert’s son Jonathan</a>
and <a href="http://www.preshortzianpuzzleproject.com/2017/09/charles-gersch-will-weng-submission-guidelines.html#:~:text=Robert%20Guilbert%20Update:">a little more via email</a>.
Jonathan wrote, in part:</p>

<blockquote>
  <p>In the photo he can be seen working on a puzzle that he designed as a “Moebius Strip” — an
“Infinity Crossword Puzzle” — a puzzle without a beginning and an end. He was going to have
this game manufactured and marketed under the name “Pago Pago,” I believe.</p>
</blockquote>

<p>Personally I suspect that Jonathan’s hunch was wrong: that the Möbius-strip puzzle and the “Pago Pago” puzzle-game
(whatever its nature was) were two separate projects. However, apparently on the strength
of Jonathan’s guess, the Möbius–Pago Pago hypothesis was reproduced as fact in Adrienne Raphel’s dissertation
<a href="https://dash.harvard.edu/server/api/core/bitstreams/b332a223-4785-4322-b81c-5e504bd2fde5/content">“The Crossword Mentality in Modern Literature and Culture”</a>
(Harvard, 2018):
“In 1986, Robert Guilbert, a former ad copywriter from Milwaukee who enjoyed
spending his retirement doing the puzzle, invented a game called Pago Pago, an infinite
crossword on a Möbius strip, and began to peddle it around to crossword fans.”
The same sentence appears in Raphel’s book
<a href="https://www.adrienneraphel.com/thinking-inside-the-box.html"><em>Thinking Inside the Box</em></a> (2020).
The game of telephone continues in Natan Last’s <a href="/blog/2026/07/28/puzzle-miscellany/"><em>Across the Universe</em></a> (2025):
“he’d invented a game called Pago Pago, an infinite crossword on a Möbius strip, and wanted to hawk
it to the greats.”</p>

<hr />

<p>UPDATE, 2026-08-13: Actually, Guilbert had already gotten <em>Pago Pago</em> into circulation
long before these articles were written! The July 1986 issue of <em>GAMES</em> magazine has
<a href="https://archive.org/details/Games-Magazine-July-1986-images/page/n61/mode/1up">a review</a>
of <em>Pago Pago</em> (Garden City, New York: Just Games). Indeed there’s no Möbius element;
the game is simply a pack of 24 William Lutwiniak crosswords plus rules for up to four
players to complete a set of grids competitively: fill squares for three minutes, then pass
the grid to your left and fill squares in your opponent’s old grid. Whoever fills in
the most squares correctly (“with penalties for errors and bonuses for correcting
opponents’ errors”) is the winner. The game has an entry
<a href="https://boardgamegeek.com/boardgame/24621/pago-pago">on BoardGameGeek</a>,
and as of this writing you can buy a copy for $25
<a href="https://www.ebay.com/itm/384956997282">on eBay</a>. (Thanks to Virginia Downes
for this information!)</p>

<hr />

<p>But what does a crossword on a Möbius strip look like, anyway? said I to myself.</p>

<p>Presumably it would be a crossword that loops around on itself from bottom to top (and vice versa).
A crossword that does that on all four edges would be “toroidal,” like this one
(which I found on <a href="https://www.andrews.edu/~calkins/math/webtexts/geom04xw.htm">Keith Calkins’ “tori crosswords” page</a>,
although I infer that Jeff Weeks was the author):</p>

<p><img src="/blog/images/2026-08-04-weeks-torus-crossword.svg" alt="A 4x4 toroidal crossword" /></p>

<p><a href="https://en.wikipedia.org/wiki/Jeffrey_Weeks_(mathematician)">Jeff Weeks</a> has made a bunch of these; see
<a href="https://momath.org/wp-content/uploads/me_handout_Weeks.pdf">this PDF</a> from MoMath. In fact he’s even made
crosswords “on a Klein bottle.” Here the right and left edges connect as before,
while the top and bottom edges connect with a Möbius half-twist.</p>

<p><img src="/blog/images/2026-08-04-weeks-kleinbottle-crossword.svg" alt="A 5x5 Klein-bottle crossword containing two 9-letter entries" /></p>

<p>The above crossword is neat because despite being 5x5, its two longest entries are 9 letters each.
But it’s less than perfectly satisfying in that half of the Across entries read right-to-left; and in
that if it actually wrapped around on itself with a half-twist, wouldn’t the letters wind up backwards
too? Then 6-Down wouldn’t be MESSENGER but
rather <nobr>ME<span style="display:inline-block;transform:scale(-1,1);">S</span><span style="display:inline-block;transform:scale(-1,1);">S</span><span style="display:inline-block;transform:scale(-1,1);">E</span><span style="display:inline-block;transform:scale(-1,1);">N</span><span style="display:inline-block;transform:scale(-1,1);">G</span>ER,</nobr> and
so on. (2-Down mirror-reverses very nicely, though!)</p>

<p>Now, a real mathematical Möbius strip, <a href="https://www.jstor.org/stable/24927595">says Martin Gardner</a>,</p>

<blockquote>
  <p>is what topologists call “nonorientable.”
Imagine the strip to be a true surface of zero thickness.
Embedded in this 2-space are <a href="/blog/2021/11/05/the-fourth-dimension/">flat creatures</a>
that are mirror-asymmetric (not
identical with their mirror images). If such a creature moves once around the
band to rejoin his fellows, he will have changed his parity and will have become
a mirror reflection of his former self.</p>
</blockquote>

<p>If our “flat creatures” are the letter-forms of the crossword entries, then when the crossword
loops around on itself the letter-forms will change parity: S becomes <span style="display:inline-block;transform:scale(-1,1);">S</span>,
and so on. So the only letters we seem to be able to use are the vertically symmetric ones, and
we’ll have great difficulty constructing any crossword more complex than the following
infinite jest:</p>

<p><img src="/blog/images/2026-08-04-haha.jpg" alt="A Möbius strip with &quot;HAHAHA...&quot; written vertically" /></p>

<p>Or we could loop horizontally with horizontally symmetric letters (HEEHEEHEE…). But to
create entries that aren’t infinitely long, we should create a <em>diagonal</em> “ladder” of words instead
— as I fancy I see Robert Guilbert doing in that photo! If our “ladder” runs diagonally
down and left, like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  ABC
 DEF
GHI
</code></pre></div></div>

<p>then we’ll be able to use letters whose axis of symmetry is on that 45-degree line, such as (of course) O and X,
but also L: “LOX” horizontally will flip to produce “XOL” as one of the Down entries. In fact we can also use W,
which (if you draw it just right) flips to become E; H, which flips to become I (with serifs); C, which flips
to become U; and even D, which (with long serifs) flips to become a nice round capital A.
This gives us enough degrees of freedom to create the following Möbius-strip crossword:</p>

<p><img src="/blog/images/2026-08-04-mobius-crossword.svg" alt="A Möbius crossword" /></p>

<p>Print out this strip and tape the ends together with a half-twist. Fill it out with a heavy
ink marker and you’ll find you only need to solve the first five clues — then you can flip the
strip over and read off the answers to the last five clues in the letter-forms that have bled
through the paper! (Or hold the back of the paper up to the light; or, for the really lazy,
just lay a mirror alongside it.)</p>

<p>Mine is not a <em>good</em> crossword. Not only does it have awful fill, it repeats entries:
six of the Acrosses are repeated among the Downs. But it was the best three-letter ladder I could find
even with computer assistance. My dictionary of <em>possible</em> answers consisted of only 23 pairs
of words. (Remember, every Across entry flips into a Down entry: if we have LAW across, we necessarily
get EDL down. And since EDL isn’t a word, LAW isn’t in our dictionary either.)
Words mirrorable this way of <em>more</em> than three letters are rare as hen’s teeth: HOWL flips into LEO I,
ALOE into WOLD, and ALOUD into A COLD; that’s about all.</p>

<p>Can you come up with a better Möbius-strip crossword? or do you have additional information on
Robert Guilbert’s Pago Pago and Möbius-strip projects?
<a href="mailto:arthur.j.odwyer@gmail.com">Email</a> and tell me about it!</p>

<hr />

<p>See also:</p>

<ul>
  <li><a href="/blog/2025/01/03/double-crossword/">“Fully Schrödinger crosswords”</a> (2025-01-03)</li>
</ul>]]></content><author><name></name></author><category term="crosswords" /><category term="math" /><category term="pretty-pictures" /><category term="puzzles" /><summary type="html"><![CDATA[Randall Rothenberg in the _New York Times_ (1988-08-10) writes that although ["Puzzle Makers Exchange Cross Words"](https://archive.is/K2Hw8) about the fall of ERNE and ESNE and the rise of XEROX and PEACE PLAN, one Robert Guilbert Sr. > was ignorant of the dispute two years ago when he developed a competitive crossword game > called Pago Pago and first became aware of crossword fans' passion for the pastime.]]></summary></entry><entry><title type="html">Kinton Ford’s _Canto I_</title><link href="https://quuxplusone.github.io/blog/2026/07/31/kinton-ford-inferno-i/" rel="alternate" type="text/html" title="Kinton Ford’s _Canto I_" /><published>2026-07-31T00:01:00+00:00</published><updated>2026-07-31T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/07/31/kinton-ford-inferno-i</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/07/31/kinton-ford-inferno-i/"><![CDATA[<p>In <a href="/blog/2025/08/11/varaldo-and-chiti/">“Varaldo’s <em>Shahrazad</em> and Chiti’s <em>Centunesimo Canto</em>”</a>
(2025-08-11) I mentioned the existence of a lipogrammatic translation of Canto I of
Dante’s <em>Inferno</em> performed by one Kinton Ford (a pseudonym, as far as I know)
for Rick Whitaker’s now-defunct literary e-zine
<a href="https://web.archive.org/web/20240302015106/https://www.exquisitepandemicarchives.com/"><em>Exquisite Pandemic</em></a>
(2020–2021). A year later, seeing it’s still unavailable anywhere else online,
I feel justified in preserving that whole tour-de-force here for posterity.</p>

<p>Ford’s canto, like Dante’s, is exactly 136 lines of pure <em>terza rima</em>,
containing a few impressively novel rhymes and many powerful images. Notably
Ford finds room to expand Dante’s <em>Oh felice colui cu’ ivi elegge!</em> from one
line into three.</p>

<blockquote>
  <p>Just halfway through my own trip in our living,<br />
 Provisional, short world, I found that I<br />
 Had lost my path — woods dark and unforgiving<br />
Making my way so hard that I must sigh<br />
 If I would say how brutal was that wood,<br />
 To think on which will always horrify.<br />
If anything, it’s only dying could<br />
 Outdo that acrid wood’s malignity.<br />
 But I will turn from horror, towards that good<br />
Which also on that pathway, luckily,<br />
 I found, though I can’t say what hid all truth<br />
 Away in total blank stupidity.<br />
I cannot work out how it was, in sooth,<br />
 That in that gloom awaking, full of stupor,<br />
 I’d lost that saving road I took in youth.<br />
I got at last to what you’d call a croup or<br />
 Boundary of that dark and dismal hollow,<br />
 A bank of rocks transforming hill-wall to floor.<br />
To that bluff’s scapula my look did follow<br />
 Upwards still that guiding morning glow,<br />
 Bright from that star so holy to Apollo.<br />
Thus did that anxious horror, which had so<br />
 Brought churning with it, all that awful night,<br />
 To my soul’s pool, diminish, calm its flow.<br />
And as a man who pants hard, still in sight<br />
 Of billows which, almost, brought him to sink,<br />
 From land looks back on that main, full of fright,<br />
So did my spirit, panicking, still think<br />
 On that grim pass no mortal human can<br />
 Go out of without passing living’s brink.<br />
At last my body pausing for a span<br />
 Until invigoration from that stop<br />
 Could now allow it motion, though no plan<br />
Could show it how to go, with constant prop<br />
 On foot in back and downwards, sought to gain,<br />
 By climbing always upwards, that mount’s top.<br />
And lo! A cougar stood stock still, though plain<br />
 Its quick and light agility. No turning<br />
 Could pass it by. Upon its skin a rain<br />
Of spots, which I, that bright and airy morning<br />
 (As sun and star-companions Loving God<br />
 Had first spun, still did spin) saw as adorning<br />
That cat, a sign of succor I might laud,<br />
 During that blissful dawn, but not so bright<br />
 That I did not start shaking, on that road,<br />
At what was now arising in my sight:<br />
 A lion, drawn up high, intimidating,<br />
 So much that air and I, both full of fright<br />
About how it its stomach might start sating,<br />
 Must stop — for what? A wolf; and I was pavid,<br />
 So skinny was it, though anticipating<br />
It would sup soon on anything, for avid<br />
 It was for food: though lank it was full too:<br />
 That wolf so ruinous to man was gravid!<br />
And I was too — with fright! I could not do<br />
 What I was hoping for — to climb that hill.<br />
 Alas, I found no pathway round nor through.<br />
And as a man who’d got just what his will<br />
 Saw as most worth wishing of all things,<br />
 Now gasps on losing it, a poignant thrill<br />
Of brutal pain, transfixing with its stings<br />
 From that wolf, did I sob at, and I shrank<br />
 Darkwards, away from Sol’s loud blazonings.<br />
Back did I go, back to that lowland dank.<br />
 Abruptly in my sight shows up a man,<br />
 Who, dumb so long, I thought would sound as blank<br />
As our surround was. Straight to him I ran,<br />
 Still crying “Pity!” to him, “Man or shadow<br />
 Of a man!” “Not a man, but Mantuan,<br />
By birth,” was his account, “born sub Julio,<br />
 But it was good Augustus, though his gods<br />
 Did not say truth nor know your Christian Trio,<br />
Who was my king. My song got many nods,<br />
 All praising it as Roman history,<br />
 From Trojan loss to gain, against all odds,<br />
From burning Ilion to victory.<br />
 But why do you avoid that joyous mountain,<br />
 As though to climb you’d no ability?”<br />
“Now art thou Virgil? That riparian fountain,”<br />
 All blushingly I said, within his sight,<br />
 “Of words that all who follow find a sound in<br />
Which our own songs would sing too? If I might,<br />
 I’ll say how much I honor you, what study<br />
 I sanctify with loving to your light.<br />
But now look on that animal so bloody,<br />
 To you I turn for aid, to you I’m flying.<br />
 O horror!” “You must go this path, though muddy,”<br />
Did Virgil say, to try to hush my crying,<br />
 “If you would from this dark wood find a way.<br />
 For past that wolf can no amount of trying<br />
Attain that goal; whoso will try will pay<br />
 With his annihilation; hungrily,<br />
 Voraciously that wolf puts him away.<br />
Marrying many animals bodily,<br />
 It looks to go on doing so, until<br />
 A Sighthound, coming with finality,<br />
Shall bring its pain to culmination, kill<br />
 That awful wolf, who did not pity show.<br />
 That hound, consuming not, such is its will,<br />
Things of this world, but only what would go<br />
 With wisdom — loving all morality —<br />
 In fabrics of Franciscan monks will know<br />
His nation. Savior of low Italy<br />
 That hound is, land for which Camilla, dying<br />
 A maid, and Nisus, and his loving ally,<br />
And Turnus, all lay down for good. Now plying<br />
 Its way through any town that it might harry,<br />
 That wolf cannot avoid damnation, buying,<br />
Through vicious rivalry, a day to tarry,<br />
 So soon to finish. So I think it right<br />
 That I conduct you, and that you stay wary<br />
As onwards through this always-lasting night<br />
 You go, with sounds of always-lasting sorrow<br />
 Imploring total dying, not this blight.<br />
But going through, I will bring you tomorrow<br />
 To souls who, though in pain, stay happy with it,<br />
 Hoping to pay back soon what sin did borrow<br />
And climb salvation’s mount to that first orbit<br />
 To which I must not go. But if you will<br />
 You’ll find at that hill’s top a worthy spirit,<br />
Which I am not, as I did not fulfill<br />
 Writs laid down by that just, all-causing King,<br />
 Combatting what was law. His codicil<br />
About my task thus says: I may not bring<br />
 A pilgrim to his city. Though his might’s<br />
 Ubiquitous, from that city starts its ring<br />
Circling all worlds. O happy, any sights<br />
 Of Him; most so, who in that city strong<br />
 Find bright salvation in its million lights.”<br />
And I to him: “I pray, by your high song —<br />
 And by that God you did not know, I pray —<br />
 That you will as conductor, for as long<br />
As you can do so, bring us on that way<br />
 Of pain, at last to portals which saints hallow,<br />
 And far from this soil’s sorrow.” With no stay<br />
 On did Virgil go; downwards did I follow.</p>

  <p>  —Kinton Ford, 2020 or 2021</p>
</blockquote>

<p>Editorial notes: I adjusted some little punctuation relative to the <em>Exquisite Pandemic</em>
text. For example I removed a comma before “About how” and a period after “stay wary,”
changed a semicolon after “dank” to a period, and inserted commas around “though in pain.”</p>

<p>Though I didn’t alter them above, the confusing lines
“a poignant thrill / Of brutal pain, transfixing with its stings / From that wolf,
did I sob at, and I shrank / Darkwards” seem to detach the phrase “from that wolf”
a bit too much from “I shrank.” One might take this as a cleverly jarring bit of
<a href="https://en.wikipedia.org/wiki/Iconicity">textual iconicity</a> (“I” literally retreating behind
the “sob” to get away from the “wolf”), and/or one might prefer to imagine something more
straightforward like “…stings, / Brought sobs; and, wolf advancing, so I shrank”
or “…stings, / Shot through my gut, and from that wolf I shrank.”
I also find some disorder in the sentence beginning “Upon its skin a rain,”
but I’m less sure what might be done about that or even whether anything ought to be done,
beyond maybe changing the comma after “dawn” to a semicolon.</p>]]></content><author><name></name></author><category term="dante" /><category term="poetry" /><category term="transcription" /><category term="word-ways" /><summary type="html"><![CDATA[In “Varaldo’s Shahrazad and Chiti’s Centunesimo Canto” (2025-08-11) I mentioned the existence of a lipogrammatic translation of Canto I of Dante’s Inferno performed by one Kinton Ford (a pseudonym, as far as I know) for Rick Whitaker’s now-defunct literary e-zine Exquisite Pandemic (2020–2021). A year later, seeing it’s still unavailable anywhere else online, I feel justified in preserving that whole tour-de-force here for posterity.]]></summary></entry><entry><title type="html">How old is Ann?</title><link href="https://quuxplusone.github.io/blog/2026/07/29/how-old-is-ann/" rel="alternate" type="text/html" title="How old is Ann?" /><published>2026-07-29T00:01:00+00:00</published><updated>2026-07-29T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/07/29/how-old-is-ann</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/07/29/how-old-is-ann/"><![CDATA[<p>From <a href="https://www.nytimes.com/1924/11/17/archives/topics-of-the-times.html">“Topics of the Times,”</a>
<em>New York Times</em> of 1924-11-17:</p>

<blockquote>
  <p>The amount and quality of intelligence utilized in the working out of cross-word
puzzles almost precisely equal those that were revealed some years ago when an
amazing — and discouraging — army of Americans filled the newspapers that cater
to such folk with triumphant solutions of an arithmetical problem concerning the
age of a supposititious Ann — a problem that any eighth-grade boy or girl who is
“all there” should have solved in his or her head in about thirty seconds.</p>
</blockquote>

<p>The older I get, the more sense it makes when the phrase “some years ago” turns out
to refer to something from two decades back. The problem, apparently first published
in the <em>New York World</em> circa 1903-10-09,<sup><a href="#footnote-or-in-the-new-york-pres">[1]</a></sup>
goes like this:</p>

<blockquote>
  <p>Mary is 24 years old. She is twice as old as Ann was
when Mary was as old as Ann is now. How old is Ann?</p>
</blockquote>

<p>(A writer to the <em>Montgomery</em> (Alabama) <em>Advertiser</em> of 1903-10-24
<a href="https://www.loc.gov/resource/sn84020645/1903-10-24/ed-1/?sp=4&amp;r=0.256,0.384,0.348,0.227,0">points out</a>
that you can get the apparently-most-common wrong answer if you read the puzzle
incorrectly as “She <em>was</em> twice as old as Ann was when Mary [sic] was as old as Ann now is.”)</p>

<p>The <em>New York Evening Post</em> (quoted in the <em>Princeton</em> (Minn.) <em>Union</em>)
<a href="https://www.loc.gov/resource/sn83016758/1903-10-29/ed-1/?sp=2">opined</a>:</p>

<blockquote>
  <p>“Wherever it may have originated — and this is itself a matter of
controversy — the problem concerning the ages of Ann and Mary
has caught the country’s fancy as few such things have since
‘<a href="https://en.wikipedia.org/wiki/Charles_Martin_Crandall#Pigs_in_Clover">Pigs in Clover</a>.’ ”</p>
</blockquote>

<p><img src="/blog/images/2026-07-29-ann-in-panama.jpg" alt="Flinn, in the Evening World of 1903-11-12" class="float-right" /></p>

<p><a href="https://archive.org/details/sim_billboard_1904-02-20_16_8/page/n1"><em>Billboard</em></a>
(1904-02-20): “The question ‘How Old Is Ann?’ has been dramatized
and was staged at White Plains. Barney Gerard, the author, makes Ann a mischievous
little girl, who refuses to go to school. The school authorities get after her to
punish her but must first find out how old she is. Complications result.” •
The <a href="https://www.loc.gov/resource/sn83030193/1903-11-17/ed-1/?sp=5"><em>New York Evening World</em></a>
(1903-11-17): “ ‘How Old Is Ann?’ is the title
of a new song which Frank Daniels sang last night at the Victoria
Theatre. When the opening lines sounded the audience settled back in its seats with
a sigh of relief. ‘At last,’ it meant just as if it was expressed in words,
‘we are going to find out how old that cussed sister of Mary is.’ But they didn’t,
and there’s where the fun came in. The song has a rattling chorus and a catchy tune.” •
Cartoonist <a href="https://strippersguide.blogspot.com/2018/02/ink-slinger-profiles-by-alex-jay-ed-f.html">Ed F. Flinn</a>
<a href="https://www.loc.gov/resource/sn83030193/1903-11-12/ed-1/?sp=10">fingered</a> Ann as the cause of the
<a href="https://en.wikipedia.org/wiki/Secession_of_Panama_from_Colombia">Panamanian secession</a>. •
The <em>World</em> of 1903-11-07 <a href="https://www.loc.gov/resource/sn83030193/1903-11-07/ed-1/?sp=4&amp;r=0.259,0.412,0.254,0.241,0">“revealed”</a>
the perpetrator of the problem as one “Mr.
<a href="https://en.wikipedia.org/wiki/Perkin_Warbeck">Perkin Warbeck</a>, of Newark, N.J.”</p>

<p>The <em>Philadelphia North American</em>
<a href="https://www.loc.gov/resource/sn86092356/1903-10-19/ed-1/?sp=2&amp;r=0.277,0.053,0.313,0.297,0">published</a>
“the answers of a few leading Philadelphians.”</p>

<blockquote>
  <p>“I don’t see why that simple question is puzzling anybody. I
knew Ann is 12 years old as soon as I saw the problem,” said
<a href="https://www.findagrave.com/memorial/91217774/frank_r-shattuck">Frank R. Shattuck</a>.
“There is no other solution, I tell you. Look here, I’ll explain
it to you. Mary is 24 years old. She is twice as old as Ann —
that’s a cinch. Of course, then, Ann is half Mary’s age, or 12
years. There ought to be a comma after ‘Ann,’ though.”</p>

  <p>It was suggested to Mr. Shattuck that there was no comma in the problem.</p>

  <p>“Doesn’t make any difference,” replied he promptly.
“Let’s see — twice as old as Ann ‘was.’ That ought to be ‘is’ —
as Mary was when Ann is. I’m not mixed up. I tell you, Ann is 12.”</p>
</blockquote>

<p>Not to be outdone, the <em>New York Evening World</em> published
on <a href="https://www.loc.gov/resource/sn83030193/1903-11-09/ed-1/?sp=5">1903-11-09</a>
and <a href="https://www.loc.gov/resource/sn83030193/1903-11-10/ed-1/?sp=9">1903-11-10</a>
the answers of “many prominent men of New York,” including:</p>

<blockquote>
  <p><span class="sc">Policeman Bert Gallagher:</span> “Ann is old enough to know better
than not tell her age when she knows how much trouble her silence is causing.
She ought to be ashamed.”</p>

  <!-- https://archive.org/details/sim_new-york-times_the-new-york-times_1912-10-28_62_20001/page/n10/mode/1up -->
  <p><span class="sc"><a href="https://archive.is/NLodr">John T. Meehan</a>:</span> “Ann was ninety years old. I know, because
she and her brother shook hands with Lafayette on his visit to New York in 1824.
Old Peter was the steward of the beanery for forty years, and he was ninety-two when
he died; Ann was three years younger. He and Ann used to sell newspapers on the
Vesey Street corner during Jackson’s first term. Why, Ann was— Oh, that <em>World</em>
question about the girl who’s twice as old as herself? I haven’t time to fuss
with that. I thought you were talking about old Peter Rose’s sister Ann.”</p>

  <!-- https://www.findagrave.com/memorial/187561976/timothy_patrick-sullivan -->
  <p><span class="sc"><a href="https://archive.is/FpboI">Timothy P. Sullivan</a>:</span>
“Just twice as old as she was when Mary was twice as old as Ann. That’s easy.
Six years ago Mary was eighteen and Ann was thirteen. To-day Mary is twenty-four
and Ann is nineteen. Figure it out for yourself. Don’t you see that if Mary
is twice as old as Ann was when Mary was— I mean twice as old as Mary when Ann
was half as old as Mary, consequently— but there, let the professors figure it
out. It’s as bad as <a href="https://wordhistories.net/2020/04/20/why-mouse-when-spins/">‘when is a mice when it spins.’</a> ”</p>
</blockquote>

<p>The <em>Wyoming Tribune</em> of 1903-10-28 calls it
<a href="https://www.loc.gov/resource/sn83025231/1903-10-28/ed-1/?sp=8">“No Puzzle At All”</a>:</p>

<blockquote>
  <p>Anyone could figure it out if they would stop to think. Ann is 16, of course,
because if Mary is twice as old as Ann was, all you have to do is to find out
when. Now she is 24, Ann’s age was 12, or twice six. Mary is now four times six,
which being divided by six, gives four. Add this to twelve, and there you are. <span class="sc">—Smith.</span></p>
</blockquote>

<p>adding:</p>

<blockquote>
  <p>When Mary had a little lamb, she was twice as old as Ann was when Ann was as old
as Mary now claims to be. How old is the sheep? <span class="sc">—James Barton Adams.</span></p>
</blockquote>

<p>A correspondent for the <em>Kansas Journal</em>
<a href="https://www.loc.gov/resource/sn83030214/1903-10-18/ed-1/?sp=8">wrote</a>:</p>

<blockquote>
  <p><span class="sc">Constant Reader,</span><br />
Ann is sixty-three years of age. Obviously,
Ann is as old now as Mary was when Mary was
half as old as her present age less the age of Ann
at the time she was half as old as Mary was when
she was twice as old as Ann is, unless you figure
that Ann was half as old as if she were twice
Mary’s present age, less Ann’s age when she was
twice as old as Mary is now, or twenty-four.
Twenty-four and fifteen are thirty-nine, and
twenty-four and thirty-nine are sixty-three, which
represents Mary’s present age subtracted from half
of Mary’s age at the time she was half as old as
Ann. I would not solve this problem for any one
but a constant reader.</p>
</blockquote>

<p>The <em>Washington Times</em> of 1903-10-27
<a href="https://www.loc.gov/resource/sn84026749/1903-10-27/ed-1/?sp=6&amp;r=0.418,0.568,0.155,0.147,0">prints</a>
an anonymous poet’s take:</p>

<blockquote>
  <p>I used to be contented and took comfort in my life,<br />
I dwelt in deep placidity, removed from care and strife,<br />
I never worried as I jogged along my even way,<br />
I worked a bit, I slept a bit, and still had time for play;<br />
I never had such things as nerves; my brain was clear and cool,<br />
But now I am a nervous wreck, and soon will be a fool.</p>

  <p>It came about in this wise: One fell day a genial friend,<br />
Whose mind is full of whist and chess and problems without end,<br />
Propounded in a guileless way a problem which, to scan,<br />
Seemed simple: All you had to do was find the age of Ann.<br />
Now, Ann is Mary’s sister, which you’ve no doubt heard before,<br />
And Mary— it is impolite, but Mary’s twenty-four.</p>

  <p>Now, Mary’s twenty-four, and she is twice as old today<br />
As Ann was when her sister was — that is, of course, to say,<br />
When Mary was — as old as Mary’s sister Ann is now.<br />
Which brings the question up to you: What’s Ann’s age, anyhow?<br />
That’s what my friend propounded, and I answered, at a pinch,<br />
“The problem you propound, sir, is dead easy — it’s a cinch.”</p>

  <p>I worked all day upon it, and I also worked all night,<br />
But somehow that confounded thing would never come out right:<br />
At first I figured it that Ann was twelve, then eight, then ten,<br />
And then I twisted it around and worked it out again.<br />
This time I learned, to my dismay, that figures disagree:<br />
That although Mary’s twenty-four, her sister’s sixty-three!</p>

  <p>I raved and swore; my hair I tore; I vented all my spleen<br />
Upon some luckless wight who said that Ann was sweet sixteen.<br />
I’ve worried nights, I’ve worried days, I cannot eat my meals;<br />
I jabber those confounded words until my poor brain reels;<br />
If this thing keeps up many moons, good-bye, old world — farewell!<br />
For me ’twill be the welcome grave, or else the padded cell.</p>
</blockquote>

<p>(A less entertaining, but more democratic, sampling of “Ann” correspondence
<a href="https://www.loc.gov/resource/sn83030193/1903-11-11/ed-1/?sp=5">appears</a>
in the <em>Evening World</em> of 1903-11-11.)</p>

<p>The craze was short-lived. By 1903-12-21 “Prof. Josh M. A. Long”
of the Society for the Prevention of Cruelty to Humor was
<a href="https://www.loc.gov/resource/sn83030193/1903-12-21/ed-1/?sp=13">advertising</a>
in the <em>World</em> for any information as to
“the whereabouts of ‘How Old Is Ann?’ Has been missing about ten days.
Recently released from the Old Jokes’ Home, last heard of in Harlem.”</p>

<hr />

<p>Footnote: Or in the <em>New York Press</em> of 1903-10-12, signed “John Mahon,”
if you believe a column from 1937
(<a href="https://panewsarchive.psu.edu/lccn/sn83031981/1937-11-26/ed-1/seq-5/"><em>Bellefonte</em> (Penn.) <em>Democratic-Watchman</em></a> 1937-11-26;
<a href="https://www.virginiachronicle.com/?a=d&amp;d=TSHE19371223.1.3"><em>South Hill</em> (Va.) <em>Enterprise</em></a> 1937-12-23).
Or maybe the <em>Press</em> of 1903-10-16
(<a href="https://www.virginiachronicle.com/?a=d&amp;d=HR19511005.1.2&amp;srpos=4"><em>Highland</em> (Va.) <em>Recorder</em></a> 1951-10-05).</p>

<p>But the true story, as <a href="https://archive.org/details/presbyterianstan47pres_0/page/n1220">relayed</a>
by <a href="https://www.findagrave.com/memorial/104101857/william_james-lampton">William J. Lampton</a>
in a <em>Scrap-Book</em> article titled <a href="https://babel.hathitrust.org/cgi/pt?id=njp.32101064164740&amp;seq=1116">“The Vicissitudes of a Problem”</a>
(August 1906), is that “How old is Ann?” first appeared in the <em>Newark Evening News</em> of 1903-04-21,
headlined <a href="https://newark.historyarchives.online/viewer?d=04011903-04301903&amp;cid=3401&amp;fn=newark_evening_news_usa_new_jersey_newark_19030421_english_6">“Stories of the Town.”</a>
The author was one <a href="https://www.findagrave.com/memorial/227767391/robert_duke-towne">Robert D. Towne</a>;
and when the meme didn’t catch at first in Newark, he tried again, Lampton says,
by sending it to the <em>Philadelphia North American</em> and signing it “Perkin Warbeck.”
Towne certainly let it be known that he was the “Ann” man
(<a href="https://archive.org/details/sim_editor-publisher_1905-02-11_4_38/page/2">1</a>,
<a href="https://archive.org/details/sim_editor-publisher_1911-02-25_10_35/page/2">2</a>,
<a href="https://archive.org/details/sim_editor-publisher_1903-12-19_3_26/page/n14">3</a>),
earning his obituary a spot among <em>Time</em> magazine’s
<a href="https://time.com/archive/6825337/milestones-mar-3-1952/">“Milestones”</a> of 1952-03-03.</p>

<hr />

<p>Now hear this, from the <em>Sequachee Valley</em> (Tenn.) <em>News</em> of
<a href="https://www.loc.gov/resource/sn89058250/1903-10-29/ed-1/?sp=1">1903-10-29</a>:</p>

<blockquote>
  <p>A man is twice the age his wife was when he was the age she is now.
When she reaches his present age, their combined years will be 100.
Find the age of each.</p>
</blockquote>

<p>See also:</p>

<ul>
  <li><a href="/blog/2019/08/01/what-is-8-divided-by-2-etc-etc/">“What is 8÷2(2+2)?”</a> (2019-08-01)</li>
</ul>]]></content><author><name></name></author><category term="jokes" /><category term="math" /><category term="memes" /><category term="old-shit" /><category term="poetry" /><category term="puzzles" /><summary type="html"><![CDATA[From “Topics of the Times,” New York Times of 1924-11-17:]]></summary></entry><entry><title type="html">A crosswording miscellany</title><link href="https://quuxplusone.github.io/blog/2026/07/28/puzzle-miscellany/" rel="alternate" type="text/html" title="A crosswording miscellany" /><published>2026-07-28T00:01:00+00:00</published><updated>2026-07-28T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/07/28/puzzle-miscellany</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/07/28/puzzle-miscellany/"><![CDATA[<p>I just finished reading Natan Last’s 2025 book <em>Across the Universe: The Past, Present,
and Future of the Crossword Puzzle.</em> It was… fatiguing. Now, I myself am a “discursive”
writer, so I’m throwing stones from a glass house here; but it seemed to me that Last’s
<em>every</em> paragraph consisted of three or four anecdotes halfway told, capped off with some
nonsensical simile. Open the book at random to page 31:</p>

<blockquote>
  <p>On December 11, 2022, Eric [Albert] suffered a hemorrhagic stroke of his cerebellum.
He’s lucky to be alive: around 50 percent of patients die in a month, half of those within
the first two days. When we first spoke in April 2023, I immediately asked if his language
had been affected, then regretted it. But he was fine, he said. The neurologists don’t know
why the stroke happened, or how he recovered his cognition so quickly. He says he repeated the
French he was learning to himself in the ICU. I imagined him, was almost ashamed to imagine him,
saying <em>ciré ciré ciré, épée épée épée</em> — as if the accent marks were stray neurons in need of repair
— or an item from James Joyce’s <em>Finnegans Wake</em> I’d just seen in <em>Word Ways</em> because it’s the
only “word” with five or more Q’s: <em>Quoiquoiquoiquoiquoiquoiquoiq!</em> In Joyce’s <em>Wake</em>, it’s
preceded by the line: “He lifts the lifewand and the dumb speak.” I remembered analyses of
Broca’s aphasia I’d read studying neuroscience in college […]</p>
</blockquote>

<p>Page 163:</p>

<blockquote>
  <p>In P.G. Wodehouse’s 1957 novel, <em>Something Fishy</em> (called <em>The Butler Did It</em> in
its American release), Lord Uffenham, every bit an imperious sneeze as his name suggests,
barks at his wittier niece, Jane: “[…] Run and ask Keggs what the dickens ‘Adventurer
goes in for outrageous road-speed’ is supposed to signify. Tell him it’s urgent. And I want
some more coffee… Yer can’t drink too much coffee. It bucks you up. It stimulates the
mental processes.” The answer — DESPERADO, an “outrageous” anagram of ROAD SPEED and synonym
of “adventurer” — is supplied by the august valet Augustus Keggs. Then Uffenham proceeds to
a second stinker: “Desperado, eh? Capital. Now, go and ask him what the devil ‘So the subordinate
professional on trial gets wages in advance not without demur’ means.” For the intellectual or
the upper-crust peer, the crossword and coffee must be consumed; who labors for it is immaterial.
Eliot’s brooder Prufrock “measured out [his] life in coffee spoons,” Margaret Farrar called
the <em>Times</em> Saturday crossword a “two cups of coffee puzzle,” Lord Uffenham has his niece
make the coffee and his butler solve the puzzle.</p>

  <p>The butler did it; but who is there to
say, besides Jane, that Uffenham didn’t solve it himself? One imagines Keggs following
Uffenham on a summery lawn the color of turtle shells, moving the lord’s croquet balls,
muttering “Very good shot, sir” as he does._ […]</p>
</blockquote>

<p><em>Does</em> one, though? Anyway, if you are excited by the mere idea of 300 pages of this sort of thing —
accent marks as damaged neurons, lawns the color of not just one turtle shell (i.e. a mottled
brown) but several, the names of Simon &amp; Schuster inflated into “fat illegible balloons pricked
into oblivion by a skyscraper’s spire” (page 50), a missed encounter between Vladimir Nabokov
and his future wife Véra described as “a word golf of only one, as if embalming a simpler past”
(page 169), etc., then you’re in for a treat. I myself alternately slogged and skimmed.
Many of the book’s chapters were first published individually in magazines, which explains
how the same anecdotes keep recurring.
“Three-letter word for a female swan” appears on page 54 and again on page 222.
There are two capsule biographies of Elizabeth Gorski and at least three of Arthur Wynne.</p>

<p>Last’s shotgun approach does give starting points for some interesting web sleuthing.
For example, he reprints a butterfly-shaped Russian-language crossword drawn by Nabokov on 1926-07-06.
The image he uses just comes <a href="https://commons.wikimedia.org/wiki/File:Nabokov%27s_butterfly_crossword.jpg">from Wikipedia</a>,
which got it from a tweet; but Nabokov’s tiny handwriting is solvably transcribed
in <a href="https://1.librebook.me/pisma_k_vere/vol4/1#:~:text=Crestos"><em>Письма к Вере</em></a>
(“Letters to Véra,” 2014).
(Thanks to Russian StackExchange for that link!) The solution to Nabokov’s butterfly
crossword is (spoiler) <a href="/blog/code/2026-07-28-nabokov-butterfly-solution.md">here</a>.</p>

<hr />

<p>Last mentions that <a href="https://en.wikipedia.org/wiki/Georges_Perec">Georges Perec</a>,
of <em>La Disparition</em> lipogram fame, also wrote crosswords (in French).
See one of Perec’s, and solution, at
<a href="https://crosswordcentre.blogspot.com/p/georges-perec.html">Derek Harrison’s blog</a>.
Perec’s crosswords seem to be collected in two books:
<a href="https://amzn.to/4vZi9Qx"><em>Les mots croisés</em></a> (1979; ISBN 2863740032) and
<a href="https://amzn.to/4c7OAVI"><em>Les mots croisés II</em></a> (1986; ISBN 2867440661).</p>

<p>This reminds me that Stephen Sondheim, of Broadway fame, not only wrote cryptic
crosswords for <em>New York</em> magazine in 1968–1969 but is thereby credited with
<em>introducing</em> the cryptic to American audiences. His fantastic series of cryptics
is not hard to find online, e.g. <a href="https://chall.us/misc_cryptics/nym_sondheim.pdf">here</a>
and <a href="https://blogfott.blogspot.com/2014/07/putting-it-together.html">here</a> and
even on nymag.com (<a href="https://nymag.com/docs/08/03/nymag-sondheim01.pdf">1</a>,
<a href="https://nymag.com/docs/08/03/nymag-sondheim02.pdf">2</a>,
<a href="https://nymag.com/docs/08/03/nymag-sondheim06.pdf">3</a>).
My favorite is 1968-04-29’s “One Shy.”</p>

<p>Fun fact: Sondheim apparently inspired the “Andrew Wyke” character in <em>Sleuth</em>.
(Run, don’t walk, to see the <a href="https://en.wikipedia.org/wiki/Sleuth_(1972_film)">1972 film</a>;
skip the bizarre 2007 remake.) From the <em>New York Times</em> of
<a href="https://archive.nytimes.com/www.nytimes.com/books/98/07/19/specials/sondheim-shaffer.html">1996-03-10</a>:</p>

<blockquote>
  <p>SONDHEIM: Did I ever tell you about the time I met Sir Laurence Olivier?
[He] said, “Oh, Mr. Sondheim, I’m so delighted to meet you. I’ve been playing you.”
Of course I thought he meant playing records … I said, “Which show?” And he replied,
“No, I’ve been playing you in the movie.”</p>
</blockquote>

<hr />

<p>I should mention that a really <em>great</em> book about crosswords and crosswording is
Coral Amende’s <a href="https://amzn.to/4x6FvEO"><em>The Crossword Obsession</em></a> (2001).
It consists almost entirely of crossword constructors’ own words,
and is fantastically entertaining.
<a href="https://archive.org/details/crosswordobsessi00amen/page/n74">This anecdote</a> from John Samson
has lived rent-free in my head for the past 25 years:</p>

<blockquote>
  <p>SAMSON: The first crossword I sent [NYT puzzle editor Eugene Maleska] was so bad
he wrote back: “This is really amateurish. Do us both a favor and never send me
another one again. One of your entries, OX MORGUE, clued as ‘Where dead oxen
are carted off to,’ is ridiculous; also, your diagram is not symmetric, and on
top of that it contains unkeyed letters.” Needless to say, I noticed he had taken
the time to reply to me (written in longhand), which prompted another effort on my part.
…</p>
</blockquote>

<hr />

<p>By the way, Wodehouse never gives the answer to Lord Uffenham’s cryptic clue
“So the subordinate professional on trial gets wages in advance not without demur,”
but I see a strong case for PAY UNDER PROTEST.</p>

<hr />

<p>See also:</p>

<ul>
  <li><a href="/blog/2026/07/29/how-old-is-ann/">“How old is Ann?”</a> (2026-07-29)</li>
</ul>]]></content><author><name></name></author><category term="crosswords" /><category term="litclub" /><category term="movies" /><category term="puzzles" /><category term="rant" /><category term="word-ways" /><summary type="html"><![CDATA[I just finished reading Natan Last's 2025 book _Across the Universe: The Past, Present, and Future of the Crossword Puzzle._ It was... fatiguing. Now, I myself am a "discursive" writer, so I'm throwing stones from a glass house here; but it seemed to me that Last's _every_ paragraph consisted of three or four anecdotes halfway told, capped off with some nonsensical simile. Open the book at random to page 31: > On December 11, 2022, Eric [Albert] suffered a hemorrhagic stroke of his cerebellum. > He's lucky to be alive: around 50 percent of patients die in a month, half of those within > the first two days. When we first spoke in April 2023, I immediately asked if his language > had been affected, then regretted it. But he was fine, he said. The neurologists don't know > why the stroke happened, or how he recovered his cognition so quickly. He says he repeated the > French he was learning to himself in the ICU. I imagined him, was almost ashamed to imagine him, > saying _ciré ciré ciré, épée épée épée_ — as if the accent marks were stray neurons in need of repair > — or an item from James Joyce's _Finnegans Wake_ I'd just seen in _Word Ways_ because it's the > only "word" with five or more Q's: _Quoiquoiquoiquoiquoiquoiquoiq!_ In Joyce's _Wake_, it's > preceded by the line: "He lifts the lifewand and the dumb speak." I remembered analyses of > Broca's aphasia I'd read studying neuroscience in college [...]]]></summary></entry><entry><title type="html">Interconverting `std::function` with `copyable_function`</title><link href="https://quuxplusone.github.io/blog/2026/07/26/function-explosion/" rel="alternate" type="text/html" title="Interconverting `std::function` with `copyable_function`" /><published>2026-07-26T00:01:00+00:00</published><updated>2026-07-26T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/07/26/function-explosion</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/07/26/function-explosion/"><![CDATA[<p>C++11 introduced <code class="language-plaintext highlighter-rouge">std::function</code> as a <a href="/blog/2019/03/18/what-is-type-erasure/">type-erased</a>
callable-object holder. <code class="language-plaintext highlighter-rouge">function</code> was badly designed in a few ways: Its rarely used
<a href="/blog/2019/03/27/design-space-for-std-function/#type-un-erasure">“go fish” API</a> bloats
every user; it advertises <code class="language-plaintext highlighter-rouge">operator() const</code> even when the controlled object’s <code class="language-plaintext highlighter-rouge">operator()</code>
is mutating; it handles what should be a precondition violation by throwing an exception,
which again bloats every user and means its <code class="language-plaintext highlighter-rouge">operator()</code> can never be noexcept.
So C++26 fixed these problems by adding
<a href="https://en.cppreference.com/cpp/utility/functional/copyable_function"><code class="language-plaintext highlighter-rouge">std::copyable_function</code></a>.
(Which preserves <em>some</em> of <code class="language-plaintext highlighter-rouge">function</code>’s
suboptimal design decisions: <code class="language-plaintext highlighter-rouge">copyable_function&lt;bool()&gt;</code> remains implicitly convertible
to <code class="language-plaintext highlighter-rouge">copyable_function&lt;void()&gt;</code>, contextually convertible to <code class="language-plaintext highlighter-rouge">bool</code>, and assignable
from <code class="language-plaintext highlighter-rouge">nullptr</code>.)</p>

<p><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2548r6.pdf">P2548 “<code class="language-plaintext highlighter-rouge">copyable_function</code>”</a> (Hava 2023)
contains this guidance for implementors:</p>

<blockquote>
  <p>It is recommended that implementors do not perform additional allocations when
converting from a <code class="language-plaintext highlighter-rouge">copyable_function</code> instantiation to a compatible
<code class="language-plaintext highlighter-rouge">move_only_function</code> instantiation, but this is left as quality-of-implementation.</p>
</blockquote>

<p>Note that converting in the other direction — from <code class="language-plaintext highlighter-rouge">move_only_function</code> to
<code class="language-plaintext highlighter-rouge">copyable_function</code> — is disallowed: <code class="language-plaintext highlighter-rouge">copyable_function</code> can hold only
copyable callables, and <code class="language-plaintext highlighter-rouge">move_only_function</code> is not copyable.</p>

<p>But <code class="language-plaintext highlighter-rouge">copyable_function</code> is interconvertible — both directions — with <code class="language-plaintext highlighter-rouge">std::function</code>!
Both of these type-erased wrappers are constructible from anything that is copyable
and callable, and themselves <em>are</em> copyable and callable. So we can do this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>std::function&lt;int()&gt; f = []{ return 5; };
std::copyable_function&lt;int() const&gt; cf = std::move(f);
std::function&lt;int()&gt; g = std::move(cf);
</code></pre></div></div>

<p>You’d hope the move from <code class="language-plaintext highlighter-rouge">f</code> into <code class="language-plaintext highlighter-rouge">cf</code> would be implemented something like this:</p>

<p><img src="/blog/images/2026-07-26-hopedfor.png" alt="" /></p>

<p>and vice versa for the move back into <code class="language-plaintext highlighter-rouge">g</code>:</p>

<p><img src="/blog/images/2026-07-26-hopedfor2.png" alt="" /></p>

<p>But if <code class="language-plaintext highlighter-rouge">copyable_function</code> doesn’t know about <code class="language-plaintext highlighter-rouge">function</code>, it might just treat <code class="language-plaintext highlighter-rouge">f</code>
the same as any old rvalue of copyable, callable type: it might move a copy of <code class="language-plaintext highlighter-rouge">f</code>
onto the heap to own.</p>

<p><img src="/blog/images/2026-07-26-expected.png" alt="" /></p>

<p>And vice versa for the move back into <code class="language-plaintext highlighter-rouge">g</code>: <code class="language-plaintext highlighter-rouge">function</code> might just treat <code class="language-plaintext highlighter-rouge">cf</code> the
same as any old rvalue of copyable, callable type, and move a copy of <code class="language-plaintext highlighter-rouge">cf</code> onto
the heap to own.</p>

<p><img src="/blog/images/2026-07-26-expected2.png" alt="" /></p>

<p>This move operation is still relatively <em>performant</em> — it does only O(1) work
for each construction — but after a sequence of \(n\) such constructions, we’ve
produced a sort of “linked list” of callables of length \(n\). Each time we invoke
<code class="language-plaintext highlighter-rouge">g</code>, <code class="language-plaintext highlighter-rouge">g</code>’s <code class="language-plaintext highlighter-rouge">operator()</code> will call the <code class="language-plaintext highlighter-rouge">operator()</code> of its controlled <code class="language-plaintext highlighter-rouge">copyable_function</code>,
which calls the <code class="language-plaintext highlighter-rouge">operator()</code> of its controlled <code class="language-plaintext highlighter-rouge">function</code>, which calls the <code class="language-plaintext highlighter-rouge">operator()</code>
of its controlled lambda (the green object in these diagrams).</p>

<hr />

<p>As of this writing (July 2026), libstdc++ is the only one of the Big Three STL vendors
to have implemented C++26 <code class="language-plaintext highlighter-rouge">copyable_function</code>; and as of this writing, they’ve
implemented the “bad” behavior diagrammed above.</p>

<p>Consider the following contrived scenario:
We have some kind of “handler callback” stored in a <code class="language-plaintext highlighter-rouge">std::function</code>. Periodically we
consider whether to modify that handler based on user input, e.g.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>using Handler = std::function&lt;bool(char)&gt;;

Handler update(Handler h, bool negate) {
  if (negate) {
    h = [f = std::move(h)](char c) { return !f(c); };
  }
  return h;
}

~~~~
Handler h = original_handler;
while (~~~~) {
  ~~~~
  h = update(std::move(h), (input == '!'));
}
</code></pre></div></div>

<p>Observe that <code class="language-plaintext highlighter-rouge">h</code> is moved into <code class="language-plaintext highlighter-rouge">update</code>, and moved out again (thanks to
<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2266r3.html#wording">implicit move</a>).
This uses the move constructor of <code class="language-plaintext highlighter-rouge">std::function</code>, which, like most move constructors,
is quick and non-allocating.</p>

<p>But suppose one of our coworkers updates part of this code to C++26,
where we might reasonably prefer to use <code class="language-plaintext highlighter-rouge">std::copyable_function</code> in place of
<code class="language-plaintext highlighter-rouge">std::function</code>.<sup><a href="#footnote-should-you-abandon-func">[1]</a></sup>
If our coworker updates the whole codebase to use <code class="language-plaintext highlighter-rouge">copyable_function</code> consistently,
there’s no problem. But what if they update only their part, so that their new
<code class="language-plaintext highlighter-rouge">copyable_function</code>-based code must interoperate with everyone else’s old
<code class="language-plaintext highlighter-rouge">function</code>-based code? Then we get something like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>using OldHandler = std::function&lt;bool(char)&gt;;
using NewHandler = std::copyable_function&lt;bool(char)&gt;;

OldHandler update(OldHandler h, bool negate);
  // unchanged, for the benefit of pre-C++26 callers

~~~~
NewHandler h = original_handler;
while (~~~~) {
  ~~~~
  h = update(std::move(h), (input == '!'));
}
</code></pre></div></div>

<p>This triggers that “linked list” scenario, and <code class="language-plaintext highlighter-rouge">h</code>’s call operator gets slower
with every round-trip through <code class="language-plaintext highlighter-rouge">update</code> — even when <code class="language-plaintext highlighter-rouge">negate</code> is <code class="language-plaintext highlighter-rouge">false</code>!</p>

<p>I wrote up this little benchmark (<a href="https://godbolt.org/z/zG9WW6bdK">Godbolt</a>):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#include &lt;chrono&gt;
#include &lt;cstdio&gt;
#include &lt;functional&gt;

size_t now() {
  static const auto epoch = std::chrono::high_resolution_clock::now();
  auto tp = std::chrono::high_resolution_clock::now();
  return std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(tp - epoch).count();
}

void print_elapsed_time(int i, size_t call_started) {
  printf("Invocation on the %dth iteration took %zu us\n", i, now() - call_started);
}

using OldHandler = std::function&lt;void(int, size_t)&gt;;
using NewHandler = std::copyable_function&lt;void(int, size_t) const&gt;;

OldHandler update(OldHandler h, bool negate) {
  if (negate) { /* do something here, but for this example we don't care what */ }
  return h;
}

int main() {
  NewHandler handler = print_elapsed_time;
  for (int i = 0; i &lt; 160'000; ++i) {
    handler = update(std::move(handler), false);
    if (i % 10'000 == 0) {
      handler(i, now());
    }
  }
}
</code></pre></div></div>

<p>Run this program on libstdc++ (as of GCC 16) and you’ll see output something like
the following:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Invocation on the 0th iteration took 0 us
Invocation on the 10000th iteration took 180 us
Invocation on the 20000th iteration took 296 us
Invocation on the 30000th iteration took 365 us
[...]
Invocation on the 130000th iteration took 1057 us
Invocation on the 140000th iteration took 1108 us
Invocation on the 150000th iteration took 1202 us
</code></pre></div></div>

<p>Each time we invoke <code class="language-plaintext highlighter-rouge">handler(i, now())</code> the “linked list of callables” hanging off
<code class="language-plaintext highlighter-rouge">handler</code> is 10,000 elements longer than before, and takes about 100 microseconds
longer to chase those pointers. Of course it also holds onto many kilobytes more
memory than needed, too. This is a “logical memory leak”: that memory
is technically still accessible and will be freed by <code class="language-plaintext highlighter-rouge">h</code>’s destructor, but as long
as <code class="language-plaintext highlighter-rouge">h</code> lives we’ll see our RAM usage creep higher and higher over time, without
any change in the “logical” state of our program.</p>

<hr />

<p>As of July 2026, Microsoft STL makes <code class="language-plaintext highlighter-rouge">move_only_function</code> and <code class="language-plaintext highlighter-rouge">function</code> interoperate
without such “logical memory leaks,” and I bet their <code class="language-plaintext highlighter-rouge">copyable_function</code> will also
avoid them, once they implement that type. libstdc++’s implementation may improve
in the future. Meanwhile, libc++ hasn’t implemented either <code class="language-plaintext highlighter-rouge">move_only_function</code> or
<code class="language-plaintext highlighter-rouge">copyable_function</code> yet, so they still have plenty of time to think about this issue.</p>

<hr />

<p>Beware of a simpler version of this pitfall, by the way, when writing your own type-erased
types. Make sure that when you copy a <code class="language-plaintext highlighter-rouge">Printable</code>-holding-an-<code class="language-plaintext highlighter-rouge">int</code>, you get another
<code class="language-plaintext highlighter-rouge">Printable</code>-holding-an-<code class="language-plaintext highlighter-rouge">int</code> and not a <code class="language-plaintext highlighter-rouge">Printable</code>-holding-a-<code class="language-plaintext highlighter-rouge">Printable</code>-holding-an-<code class="language-plaintext highlighter-rouge">int</code>.
Write unit tests to make sure that still holds when constructing from a <code class="language-plaintext highlighter-rouge">Printable&amp;</code>;
from a <code class="language-plaintext highlighter-rouge">const Printable&amp;</code>; from a <code class="language-plaintext highlighter-rouge">Printable&amp;&amp;</code>; and from a <code class="language-plaintext highlighter-rouge">const Printable&amp;&amp;</code>.
Solving this problem gets more painful if, like the STL, you have more than one
type-erased type that need to play well together. Try to avoid getting into that
situation if you can; but be aware of this pitfall if you must.</p>

<hr />

<p>Footnote: <em>Should</em> you abandon <code class="language-plaintext highlighter-rouge">function</code> for <code class="language-plaintext highlighter-rouge">copyable_function</code>
in C++26? Some would say yes. Personally I would say that you ought to abandon both,
and write your own type-erased callable instead. It takes less than 100 lines!</p>

<p>In completely green-field C++26 code, sure, I’d recommend <code class="language-plaintext highlighter-rouge">copyable_function</code> over
<code class="language-plaintext highlighter-rouge">function</code> (once your vendor implements it). I would <em>not</em> recommend mixing both
types in the same brown-field codebase; I’d pick one and stick with it, while working
toward a point where you could update the entire codebase at once.</p>]]></content><author><name></name></author><category term="benchmarks" /><category term="implementation-divergence" /><category term="pitfalls" /><category term="standard-library-trivia" /><category term="type-erasure" /><summary type="html"><![CDATA[C++11 introduced std::function as a type-erased callable-object holder. function was badly designed in a few ways: Its rarely used “go fish” API bloats every user; it advertises operator() const even when the controlled object’s operator() is mutating; it handles what should be a precondition violation by throwing an exception, which again bloats every user and means its operator() can never be noexcept. So C++26 fixed these problems by adding std::copyable_function. (Which preserves some of function’s suboptimal design decisions: copyable_function&lt;bool()&gt; remains implicitly convertible to copyable_function&lt;void()&gt;, contextually convertible to bool, and assignable from nullptr.)]]></summary></entry><entry><title type="html">Egerton MS 1995</title><link href="https://quuxplusone.github.io/blog/2026/07/16/egerton-ms-1995/" rel="alternate" type="text/html" title="Egerton MS 1995" /><published>2026-07-16T00:01:00+00:00</published><updated>2026-07-16T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/07/16/egerton-ms-1995</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/07/16/egerton-ms-1995/"><![CDATA[<p>Previously on this blog: <a href="/blog/2026/05/22/exaltation-of-larks/">“The <em>Book of St Albans</em> (1486)”</a> (2026-05-22),
in which I made a table of terms of venery, a.k.a. company terms, e.g. “an exaltation of larks,”
as in the eponymous <a href="https://archive.org/details/exaltationoflark00jame">book</a> by James Lipton.
I mentioned that the <em>Book of St Albans</em> actually has “an exaltyng of larkis,” and that it’s only
in <a href="https://searcharchives.bl.uk/catalog/032-001982919">Egerton MS 1995</a> (circa 1450), according to
Lipton, that we find “an exaltacyon of larkys” proper. But I couldn’t find any digitized copy of
Egerton MS 1995 to verify that claim.</p>

<p>Well, I wrote to the British Library and got the relevant folios digitized; so I can now present a
rough transcription of the Egerton manuscript’s venereal passages. (Sadly there is insufficient communication
between the Library’s division who scan things for money and the division who publish things in the
digital online catalog; I have the scan, but the British Library’s online catalog still will not.
Therefore I’ve uploaded it also to <a href="https://archive.org/details/EgertonMS1995-ff54-65/page/n3/mode/1up">the Internet Archive</a>,
where — at least for now — you also may view it.)</p>

<p>For brief inventories of the whole contents of Egerton MS 1995, see:</p>

<ul>
  <li>
    <p><a href="https://searcharchives.bl.uk/catalog/032-001982919">The British Museum’s catalog entry</a></p>
  </li>
  <li>
    <p><a href="https://archive.org/details/catalogueofsomebooksnobleman/page/154">Item 2105</a> in an 1865
  auction catalog of “highly important and valuable books and
  manuscripts of a nobleman of great literary and artistic taste”</p>
  </li>
  <li>
    <p>James Gairdner,
  <a href="https://archive.org/details/11326849bsb/page/n7"><em>The historical collections of a citizen of London in the fifteenth century</em></a>
  (Camden Society, 1876)</p>
  </li>
</ul>

<p>Do you have a correction or helpful comment on this transcription?
<a href="mailto:arthur.j.odwyer@gmail.com">Send me an email!</a></p>

<hr />

<p>(Fols. 55v ff.)</p>

<p>Note ye the properteys that longythe to a yonge gentylle man to have knowynge of ſuche
thyngys that longythe unto hym that he fayle not in hys propyr termys that longythe unto hym
as hyt ſhalle folowe hereynne wrytynge ❦</p>

<p>The Condyſcyons of a grehounde ande of hys <strike>propyrnyng ~</strike> propyrteys ~</p>

<p>Thy grehounde moſte be heddyd lyke a ſnake<br />
  <i>y-</i>neckyd lyke a drake<br />
  <i>y-</i>breſtyde lyke a lyon<br />
  <strike><i>y-</i>fotyd lyke a noymon</strike><br />
  <i>y-</i>ſyded lyke a <a href="https://en.wikipedia.org/wiki/Ichneumon_(medieval_zoology)">noynon</a><br />
  <i>y-</i>fotyde lyke a catte<br />
  <i>y-</i>taylyd lyke a ratte<br /></p>

<p>Thenne ys the grehounde welle <i>y-</i>ſhapte ~</p>

<hr />

<p>Termys of venery ❦</p>

<table class="smaller">
  <tbody>
    <tr>
      <td>A herde of hertys</td>
      <td>Draſſe of houndys</td>
    </tr>
    <tr>
      <td>herde of Dere</td>
      <td>kenelle of Raychys</td>
    </tr>
    <tr>
      <td>herde of Swannys</td>
      <td>Copylle of Spaynellys</td>
    </tr>
    <tr>
      <td>herde of Cranys</td>
      <td>Sowſe of a lyonas<sup>(?)</sup></td>
    </tr>
    <tr>
      <td>herde of Curlewys</td>
      <td>lyttur of whelpys</td>
    </tr>
    <tr>
      <td>Ny of Feſauntys</td>
      <td>Cowardenys of Currys</td>
    </tr>
    <tr>
      <td>Covaye of Parterygys</td>
      <td>Synguler of Boorys</td>
    </tr>
    <tr>
      <td>Bevy of ladyes</td>
      <td>Sundyr of wylde Swyne</td>
    </tr>
    <tr>
      <td>Bevy of Quaylys</td>
      <td>Dryfte of Tame Swyne</td>
    </tr>
    <tr>
      <td>Bevy of Roys</td>
      <td><strike>Cond</strike> Cloudyr of Cattys<br /> <i>Non dicitur a clouſter</i></td>
    </tr>
    <tr>
      <td>Sege of Betowrys</td>
      <td>harrys of hors</td>
    </tr>
    <tr>
      <td>Sege of hayrynnys</td>
      <td>Stoode of marys</td>
    </tr>
    <tr>
      <td>Sege unto a Caſtelle</td>
      <td>Stalyn of olde hors</td>
    </tr>
    <tr>
      <td>ſprynge of Telys</td>
      <td>Rage of Coltys</td>
    </tr>
    <tr>
      <td>Fluſche of mallardys</td>
      <td>Paſſe of Aſſys</td>
    </tr>
    <tr>
      <td>Dyſſayte of lepwynkys</td>
      <td>Burdynne of mulyſſe</td>
    </tr>
    <tr>
      <td>mouſtyr of Pecockys</td>
      <td>Droffe of Nete</td>
    </tr>
    <tr>
      <td>Falle of woodecockys</td>
      <td>Tryppe of Gete</td>
    </tr>
    <tr>
      <td>walke of Snytys</td>
      <td>Flocke of Schepe</td>
    </tr>
    <tr>
      <td>Congregacyon of Plovers</td>
      <td>Drove or a huſke of Harrys</td>
    </tr>
    <tr>
      <td>Coverete of Cootys</td>
      <td>Gagelynge of Geſſe</td>
    </tr>
    <tr>
      <td>Exaltacyon of larkys</td>
      <td>Broode of hennyſſe</td>
    </tr>
    <tr>
      <td>wayche of Nyghtynggalys</td>
      <td>Pype of Chekynnyſſe</td>
    </tr>
    <tr>
      <td>Flyght of Dovys</td>
      <td>Padelynge of Dookyſſe</td>
    </tr>
    <tr>
      <td>Flyght of Swalys</td>
      <td>Pontyfycalle of Preſtyſſe</td>
    </tr>
    <tr>
      <td>Tydynge of Pyys</td>
      <td>State of Pryncyſſe</td>
    </tr>
    <tr>
      <td>Oſte of men</td>
      <td>Dygnyte of Chanonnyſſe</td>
    </tr>
    <tr>
      <td>Oſte of Sparowys</td>
      <td>Trought of Barronnyſſe</td>
    </tr>
    <tr>
      <td>Felyſchyppe of yemen</td>
      <td>Carge of Curettyſſe</td>
    </tr>
    <tr>
      <td>Swarme of Beys</td>
      <td>Prudens of Vycaryſſe</td>
    </tr>
    <tr>
      <td>Chyrme of Goldefynchys</td>
      <td>Dyſcrecyon of Preſtys</td>
    </tr>
    <tr>
      <td>Caſte of hawkys of the Towre</td>
      <td>Doctryne of Docterſſe</td>
    </tr>
    <tr>
      <td>Flyght of Goſſe hawkys</td>
      <td>Convertynge of Precheryſſe</td>
    </tr>
    <tr>
      <td>Unkyndenys of ravynnys</td>
      <td>Sedent of Juggyſſe</td>
    </tr>
    <tr>
      <td>murther of Crowys</td>
      <td>Eloquens of lawyers</td>
    </tr>
    <tr>
      <td>Byldynge of Rookys</td>
      <td>Dampnynge of Juryerſſe</td>
    </tr>
    <tr>
      <td>murmuracyon of Starys</td>
      <td>Execucyon of Offycers</td>
    </tr>
    <tr>
      <td>Chatterynge of Choughys</td>
      <td>Dylygens of maſſyngers</td>
    </tr>
    <tr>
      <td>Dyſſymylacyon of alle ſmalle Bryddys</td>
      <td>Faythe of marchauntyſſe</td>
    </tr>
    <tr>
      <td>Rowte of knyghtys</td>
      <td>Obedyens of Servandys</td>
    </tr>
    <tr>
      <td>Rowte of Gentylle men</td>
      <td>Prevyſyon of ſtywardyſſe</td>
    </tr>
    <tr>
      <td>Rowte of wylde wolfys</td>
      <td>Sete of huſcheryſſe</td>
    </tr>
    <tr>
      <td>Pryde of lyons</td>
      <td>kerffe of Panterſſe</td>
    </tr>
    <tr>
      <td>lepe of lybardys</td>
      <td>Draught of Buttelerys</td>
    </tr>
    <tr>
      <td>Slouthe of Beerys</td>
      <td>Temporens of Cokys</td>
    </tr>
    <tr>
      <td>Schrewdenys of Apys</td>
      <td>Savegarde of Porteryſſe</td>
    </tr>
    <tr>
      <td>Syght of Grayys</td>
      <td>Stalke of Foſterſſe</td>
    </tr>
    <tr>
      <td>Nerthe of Foxys</td>
      <td>Blaste of hunterſſe</td>
    </tr>
    <tr>
      <td>Bery of Connys</td>
      <td>Thretynge of Curtyers</td>
    </tr>
    <tr>
      <td>Neſte of Rabettys</td>
      <td>lawghtur of Oſtylerſſe</td>
    </tr>
    <tr>
      <td>labyr of mollys</td>
      <td>Promys of Tapsteryſſe</td>
    </tr>
    <tr>
      <td>Beſynys of Ferettys</td>
      <td>Gloſyng of Taverneryſſe</td>
    </tr>
    <tr>
      <td>leſſe of Grehoundys</td>
      <td>lyynge of Pardynerſſe</td>
    </tr>
  </tbody>
</table>

<p>Here begynnythe the Termys of kervynge of Fowlys ande of Fyſchyſſe ❦</p>

<table class="smaller">
  <tbody>
    <tr>
      <td>A Ryſte<sup>(?)</sup> a Dere ys Br<sup>o</sup>kynne</td>
      <td>Pecocke ys dyſfyguryde</td>
    </tr>
    <tr>
      <td>Brawyn ys leyſchyde</td>
      <td>Corlowe ys unrowtyde<sup>(?)</sup></td>
    </tr>
    <tr>
      <td>Paſtey ys brouderydde</td>
      <td>Bytterne ys untachyde</td>
    </tr>
    <tr>
      <td>Goſſe ys rerryde</td>
      <td>Egrete ys <i>y-</i>kneyde</td>
    </tr>
    <tr>
      <td>Swanne ys lyfte</td>
      <td>Papyr ys lowryde<sup>(?)</sup></td>
    </tr>
    <tr>
      <td>Caponne ys Sawſyde</td>
      <td>Gulle ys <i>y-</i>Brawynde</td>
    </tr>
    <tr>
      <td>Henne ys ſpoylyde</td>
      <td>Feſonde ys <i>y-</i>haylyde</td>
    </tr>
    <tr>
      <td>Chekynne ys ffaſſyde</td>
      <td>Parteryche — Alle thes benne wyngyde<br />Quayle</td>
    </tr>
    <tr>
      <td>Mallerde ys unbraſſydde</td>
      <td>Rayle ys Breſtyde</td>
    </tr>
    <tr>
      <td>Conyng ys unlaſyde</td>
      <td>Plouer ys mynſchyde</td>
    </tr>
    <tr>
      <td>Hayryn ys dysmemberyde</td>
      <td>Woodecocke — Alle thes benne <i>y-</i>ſchrydde<br />Pegonne<sup>(?)</sup></td>
    </tr>
    <tr>
      <td>Crane ys Dyſplayde</td>
      <td>¶ And alle ſmalle Bryddys ben <i>y-</i>ſchrydde</td>
    </tr>
  </tbody>
</table>

<p>Alle the Termys that longgythe unto fyſche ~</p>

<table class="smaller">
  <tbody>
    <tr>
      <td>Samon ys Chynyde</td>
      <td> </td>
    </tr>
    <tr>
      <td>Gounarde Chynyde</td>
      <td>Chevynne ys vynnydde</td>
    </tr>
    <tr>
      <td>lampray ys cordyde</td>
      <td>Barbule ys <i>y-</i>Tuſkydde</td>
    </tr>
    <tr>
      <td>Pyke ſplayde</td>
      <td>Ele ys Trowſyde or ellys <i>y-</i>colpynnyd</td>
    </tr>
    <tr>
      <td>Tenche ſowſyde<br /> Or ellys he may be take yn a jollye<sup>(?)</sup></td>
      <td>Trowght <i>y-</i>colpynnyde<br /> or ellys he ys Chevernyd or ellys ynundate<sup>(?)</sup> ~</td>
    </tr>
    <tr>
      <td>Playſſe ys ſawſyde</td>
      <td>Roche <i>y-</i>Bonyde or rybbyde</td>
    </tr>
    <tr>
      <td>Haddocke ys Sydyde</td>
      <td>Crabbe ys mynyde<sup>(?)</sup></td>
    </tr>
    <tr>
      <td>Breme ys Splayde</td>
      <td>Crawys ys unmaylyde</td>
    </tr>
  </tbody>
</table>

<p>Explicit ❦</p>

<hr />

<p>There follows a poem, “Litylle chyldrynne here may ye lere,” which is transcribed in
F. J. Furnivall’s <a href="https://archive.org/details/b24854967/page/265/mode/2up"><em>Early English Meals and Manners</em></a>
(Early English Text Society #32, 1868). Picking up again at folio 60r:</p>

<blockquote>
  <p>Here endythe the boke of Curteſy that ys fulle neceſſary unto yonge
chyldryn that muſte nedys lerne the maner of curteſy ~</p>

  <p>Explicit; Amen.</p>
</blockquote>

<hr />

<blockquote>
  <p>There was a man that hadde nought,<br />
There come thevys &amp; robbyd hỹ &amp; toke nought,<br />
He ranne owte and cryde nought,<br />
Why ſhulde he crye, he loſte nought,<br />
Here ys a tale of ryght noughte.</p>
</blockquote>

<hr />

<blockquote>
  <p>Cronica ſi pences ſi certant oxonienſes<br />
Poſt paucos menſes pugnabũt &amp; angliginences</p>
</blockquote>

<p>A <a href="https://en.wikipedia.org/wiki/Leonine_verse">“Leonine”</a> witticism also
attested <a href="https://archive.org/details/dictionarylatin00rilegoog/page/51">elsewhere</a>:
“The chronicles tell us that when Oxford men contend / in months all England wars from end to end.”</p>

<hr />

<p>There follows (fols. 60v–61v) a 2.5-page treatise on prophesying by the first windy night
after Christmas: <i>Si ventus fuerit in prima nocte Natalis dm̃ in illo anno
Reges et Principes Pontifices et ceteri duutes<sup>(?)</sup> vel potentes
per univerſum orbem ꝑibunt. Secunda die vel in nocte Natalis dm̃ ventus fuerit unia
per univerſum orbem frumenta et grana deficient…</i> For an 11th-century variation
on this text, see
<a href="https://gallica.bnf.fr/ark:/12148/btv1b10548488f/f389.item">BnF NAL 873, fol. 200r</a> ff.</p>

<hr />

<p>There follows (fols. 61v–62v) some Latin commentary on the twelve months.</p>

<hr />

<blockquote>
  <p>Here benne alle the namys of the byſcheppe richys of alle yngelonde and thoo
that longythe unto Yngelonde ~</p>

  <p>Canntyrbury, Yorke, Exceter, Bathe, Salyſbury, Wyncheſtye, Worceter, Rocheſter,
Cheſter, Lyncolle, Lonndon, Chicheſter, Ely, Syndavy,<sup>(?)</sup>
Synt Aſfe, Bangor, Herforde, Cardeaffe, Northewiche, Carlylle, Dyrham
[Later addition in a blacker ink: Peterborow]
— Non plura<sup>(?)</sup><br />
Sm<sup>ii</sup> anñ XXIV<sup>(?)</sup></p>

  <p>Deo gracias &amp;<sup>(?)</sup> Hylle ~</p>
</blockquote>

<p>(“Syndavy” might be St David’s, in Wales; I’m surer that “Synt Aſfe” is St Asaph’s.
I can’t hazard a guess on the Latin abbreviations, except to note that if
“annum 24” is a regnal year, the 24th year of Henry VI’s reign would have been 1448.)</p>

<hr />

<p>(Fols. 63r ff.)</p>

<p>For a yong gentylle man to knowe the termys of venery and the crafte whyche
the iiij beſtys of venery ~
The herte, the hare, the wolfe, and the wylde Bore — Of venery there bynne nomore.</p>

<p>The Beſtys of the Chaſſe as hyt apperythe ~
The Bucke, the Doo, the Roobucke, the Roodoo, the Bere,<sup>(?)</sup> and the rayne dere.</p>

<p>The Elke that ys to ſay a herte of II wyntyr
age. ¶ The ſpycurde that ys to ſay a herte of III wyntyr of age.</p>

<p>The Fulmer,<sup>(?)</sup> the Fechewe,<sup>(?)</sup> the Catte of the mountayne,
the Gray, the Fox, the Weſylle,
the martoun, the ſquyrelle, the Ottyr, the Polkatte — Alle thes benne of the ſtynkyng
Fute or ſtynkying Chaſſe, for the wylle bothe clym and crepe as for the ſubſtance of hem ❦</p>

<p>There ben Grehoundys for game and many othyr dyvers houndys
ſum<sup>(?)</sup> honeſte &amp; ſum profytabylle as hit ſhalle folowe here in wrytynge ❦</p>

<p>Fyrste a Grehounde, a Baſtarde grehounde, a mongrelle, a maſtowe,<sup>(?)</sup>
aloundys, lymoire — Alle thes ben take in to the leſſe.
¶ Spaynellys, Rangys, Kenellys, Trerors — Alle thes wylle range for to rayſſe uppe the game.
¶ Bocherhoundys, Dunghylle Currys, and ſmalle Popys for ladys Chambers.</p>

<p>Aloundys ben cuſte, lymors drawyn, a Blode hounde or a dogge for the bowe drawythe,
kenettys rennyn, ſpaynellys retryvyn. The Terer gothe undyr the gounde for to feſtyn
the Fox or the Graye ❦</p>

<p>A hunt caſtythe of a copylle of Alundys unto an herde of hertys. Then he browythe comfortỹg
hys houndys. ¶ The herte takythe the water then
the herte ſevſythe<sup>(?)</sup> <i>[perhaps <i>fuite</i>? cf. Hare’s <i>The Language of Field Sports</i>
<a href="https://archive.org/details/bwb_KQ-367-113/page/16">p16</a>]</i>.
Whenne the he ſwỹmythe downe
thanne he fletythe. ¶ Whenne that he ſwỹmythe up
on the water thenne he brekythe, or brethythe. ¶ When
that he ſwỹmythe ovyr thenne he croſſythe. ¶ Whenne
he retornythe thenne he croſſythe.<sup>(?)</sup> ¶ Whenne that
he takythe dry londe thenne he fleythe. ❦</p>

<table class="smaller">
  <tbody>
    <tr>
      <td>A herte at nyghte ben herborowde</td>
      <td>A hare ys Formyde</td>
    </tr>
    <tr>
      <td>A Bucke ys loggyde</td>
      <td>A Conyng ſyttythe</td>
    </tr>
    <tr>
      <td>A Roobucke ys Beddyde</td>
      <td>A Parterygge lythe</td>
    </tr>
    <tr>
      <td>A yeman ys Beddyde</td>
      <td>A Feſaunt ſtalkythe</td>
    </tr>
  </tbody>
</table>

<p>Explicit.</p>

<hr />

<p>The namys of hawkys and to what maner of
Perſonys that they longe unto every man aftyr
hys owne degre and ordyr ❦</p>

<p>There longyn unto an Emꝑour thre maner of hawkys ~ That ys to ſay:
an Egylle, a <a href="https://quod.lib.umich.edu/m/middle-english-dictionary/dictionary/MED50761">vature</a>,
a <a href="https://quod.lib.umich.edu/m/middle-english-dictionary/dictionary/MED27263.5">melounde</a>.</p>

<p>And the ſympylyſte of thes wylle ſlee an hynde
Calfe by hym ſelfe, or a doys Fawyn, or a
Roo, or a crane or a Buſtarde other wyſe namyde
a derefoule. Or a ſtorke or a Fox.</p>

<p>¶ And thes hawkys benne not namyd or callyd
unto the lewre; the cauſe ys for they ben ovyr hevy &amp;
ponderos for any man to bere.
¶ But they ben made unto the <a href="https://quod.lib.umich.edu/m/middle-english-dictionary/dictionary/MED33005">Perke portatyf</a>
and ther by they benne governyde.</p>

<p>¶ Ther ben hawkys of the Towre ❦</p>

<p>A Gerfaukyn, a Terſelle, a Grfaukyn — for a kynge;
a Faukyn Gentylle and a Taſſelle gentylle — For a Prynce;
a Faukyn of the Rooke — For a Duke;
a Faukyn Peragryne — for an Erle;
a Baſtarde — for every lorde;
a <a href="https://en.wikipedia.org/wiki/Saker_falcon">Saker</a> and a ſakerette — for a knyght;
a <a href="https://en.wikipedia.org/wiki/Lanner_falcon">laner</a> or a lanerette — for a ſquyer;
a <a href="https://en.wikipedia.org/wiki/Merlin_(bird)">Merlyon</a> — for a lady;
a <a href="https://en.wikipedia.org/wiki/Eurasian_hobby">Hobby</a> — for a yong ſquyer.
Alle thes ben hawkys of the Towre ~ And alle thes fleyn fro the lewre.</p>

<p>¶ The Goſhawke ys for a yeman;
a ſperhawk for a preſte;
a muſkette for a clerke.
Ande thes ben made unto the fyſte ande fle w<sup>t</sup>
hyr fre wylle yf they benne in ther proſpyte
for to make game unto hyr mayſter more þen
for any gredynys of mete for they ben noo
Rayvyners. ¶ And ſum of the hawkys
a fore ſayde wylle be made unto the fyſte
welle <i>y-</i>nowe, but they moſte gave grete labyr
to bryng them there to. ❦</p>

<p>Explicit.</p>

<hr />

<blockquote>
  <p>Gret huntyng by ryvers and wode<br />
Makythe a man ys here to growe thorowe hys hoode.</p>
</blockquote>

<hr />

<p>There follows (fols. 65r ff.) “a nobylle tretys of medyſyns for mannys body.”</p>]]></content><author><name></name></author><category term="old-shit" /><category term="transcription" /><category term="word-ways" /><summary type="html"><![CDATA[Previously on this blog: “The Book of St Albans (1486)” (2026-05-22), in which I made a table of terms of venery, a.k.a. company terms, e.g. “an exaltation of larks,” as in the eponymous book by James Lipton. I mentioned that the Book of St Albans actually has “an exaltyng of larkis,” and that it’s only in Egerton MS 1995 (circa 1450), according to Lipton, that we find “an exaltacyon of larkys” proper. But I couldn’t find any digitized copy of Egerton MS 1995 to verify that claim.]]></summary></entry><entry><title type="html">Some recent discoveries</title><link href="https://quuxplusone.github.io/blog/2026/07/01/blog-roundup/" rel="alternate" type="text/html" title="Some recent discoveries" /><published>2026-07-01T00:01:00+00:00</published><updated>2026-07-01T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/07/01/blog-roundup</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/07/01/blog-roundup/"><![CDATA[<p><b>First images of PHerc. 1667.</b>
When Vesuvius buried Herculaneum, it turned many papyrus scrolls in the <a href="https://en.wikipedia.org/wiki/Villa_of_the_Papyri">Villa dei Papiri</a>
to burnt hunks of carbon without destroying their physical structure. Since
<a href="https://web.archive.org/web/20150121160151/http://news.nationalgeographic.com/news/2015/01/150120-roman-scrolls-xray-archeology-science/">the 2010s</a>
(or earlier?), people have tried to non-invasively image what remains of the scrolls.
In June 2026, the latest “Vesuvius Challenge” prize was
awarded to a team who successfully imaged the first “complete” scroll.
The team’s report (<a href="https://scrollprize.org/pdf/main.pdf">“Complete virtual unwrapping and reading of a rolled Herculaneum papyrus”</a>,
Angelotti et al., 2026) points out that
the scroll is even less “complete” than it used to be: invasive efforts in the late 20th century
had already reduced it from about 14 grams of carbonized gunk to about 6 grams. The group’s full
transcription consists of only 300 to 400 complete words. They identify PHerc. 1667
as some sort of philosophical treatise — unsurprising, as many of the scrolls that could
already be deciphered turned out to be works of <a href="https://en.wikipedia.org/wiki/Philodemus">Philodemus</a>.
Contrary to some media reports, the title of PHerc. 1667’s work is unknown;
but a separate finding reported in the same paper identifies PHerc. 139 as
book 8 of Philodemus’s <em>On gods</em> (<em>περὶ θεῶν</em>, book <em>Η</em>).</p>

<hr />

<p><b>Three lost songs from <i>Iolanthe</i>.</b>
In April 2026, Marc Shepherd was looking at a manuscript full score of Gilbert &amp; Sullivan’s
<em>Iolanthe</em> in the British Library (<a href="https://searcharchives.bl.uk/catalog/040-003392199">MS Mus. 1824/1/7/4</a>)
and discovered at the back of the manuscript the orchestra parts for these three songs,
all cut from <em>Iolanthe</em> before the end of its run and up to now believed about as lost
as <em>Thespis</em>:</p>

<ul>
  <li>“On you they’d set a coronet” (Phyllis, Tolloller, Mountararat, Lord Chancellor)</li>
  <li>“My love for him is dead” (Phyllis)</li>
  <li>“De Belville was regarded as the Crichton of his age” (Mountararat)</li>
</ul>

<p>More information can be found in <a href="https://www.dropbox.com/scl/fi/6q23rbvwzr2w08kww476q/Iolanthe-Lost-Songs-Full-Score.pdf?rlkey=usk85rf7sv8yhcsdjx791mjjl">Shepherd’s transcription of the full score</a>;
in his blog post <a href="https://marc154391.substack.com/p/three-deleted-songs-from-iolanthe">“Three Deleted Songs from Iolanthe”</a> (May 2026);
and in a two-hour <a href="https://www.youtube.com/watch?v=wwVXI1lfs_Q">video interview</a> with William Remmers, the
music director of New York’s Utopia Opera. Utopia Opera has already put
<a href="https://www.youtube.com/watch?v=OztnnHCztSU">recordings of all three songs</a> on YouTube.</p>

<p>Shepherd remarks that Phyllis is a soprano without an aria; the deleted song would naturally
have been her big number. But Act II already has its share of wishy-washy love songs —
“You plead in vain,” “Oh foolish fay” — and “My love for him” must have seemed too samey.
Mountararat, meanwhile, is coming straight from his three-verse comic song
“When Britain really ruled the waves”; it doesn’t make much sense to
give him a <em>second</em> three-verse comic song in the same act! Still, Gilbert liked
“De Belville” <em>per se</em> so much that he republished its words in
<a href="https://archive.org/details/songsofsavoyard00gilbiala/songsofsavoyard00gilbiala/page/57"><em>Songs of a Savoyard</em></a> (1890);
it was only Sullivan’s melody that was lost.</p>

<p>Shepherd is also the coauthor of <a href="https://www.lulu.com/shop/marc-shepherd-and-michael-walters-and-w-s-gilbert/the-variorum-gilbert-sullivan-volume-i/paperback/product-17qvev44.html"><em>The Variorum Gilbert &amp; Sullivan, Volume 1</em></a>
(2015) and has edited the full scores of many of the operettas. The most interesting parts of
the Utopia interview, for me, were in the first 15 minutes where Shepherd talks about his
ongoing projects (including volumes 2–5 of the <em>Variorum</em>); and circa an hour in,
where they discuss the importance of a well-edited score and the crazy things one does when
one is lacking. The former reminds me that I have plenty of unfinished projects of my own.
For example, after I wrote <a href="/blog/2023/01/09/in-search-of-adventure-iii/">“In search of <em>Adventure ]I[</em>”</a> (2023-01-09)
I did actually receive a playable version, which I haven’t gotten around to blogging about yet;
nor have I yet written a post about my online collection of <a href="https://quuxplusone.github.io/Wikisource/Sousa/">John Philip Sousa operettas</a>.
The latter reminded me of what George Bernard Shaw said in the third edition
of <a href="https://archive.org/details/perfectwagnerite0000bern_y5w0/page/107"><em>The Perfect Wagnerite</em></a>:</p>

<blockquote>
  <p>It is possible to learn more of the world by producing a single opera,
or even conducting a single orchestral rehearsal, than by ten years
reading in the library of the British Museum.</p>
</blockquote>

<hr />

<p><b>Yet another proposed decipherment of Linear A.</b>
Via <a href="https://news.ycombinator.com/item?id=48600107">Hacker News</a>: “Amateur linguist”
Tom di Mino proposes that the Linear A script of Minoan Crete encodes a spoken language
from the Semitic family, and claims to have a list of phonetic values that
make sense of at least one inscription. He announced the news via
<a href="https://www.linkedin.com/feed/update/urn:li:activity:7471395019157835776/">LinkedIn</a>
and via <a href="https://aiclambake.com/clamtakes/linear-a/">Stephen Kosloff’s AI-themed blog</a>,
which are weird venues: weird enough to attract attention from hackers with
<a href="https://web.archive.org/web/20070714204136/http://www.michaelcrichton.net/speech-whyspeculate.html">Gell-Mann amnesia</a>,
for sure.</p>

<p>I hadn’t yet heard this news when I posted <a href="/blog/2026/06/12/syllabaries/">“Katakana and Cypriot”</a> (2026-06-12);
that was just serendipity. But on that note I observe that you can find some autodidacts
(and even allodidacts) who unironically claim that Linear A encodes spoken <em>Japanese;</em> notably
<a href="https://konosos.net/2014/12/09/the-phonetic-method-in-linear-a-decipherment/">Gretchen E. Leonhardt</a>
and <a href="https://independent.academia.edu/HiroKuroda">Mizuhiro Kuroda</a>. Needless to say,
it does not.</p>

<hr />

<p><b>Hat sighting in the wild.</b> Last week I visited ArtsWestchester in White Plains, New York,
which is housed in a former bank and occasionally uses its armored vault for art installations.
This month it’s Rana Amirtahmasebi’s “Continuum: Terra,” in which the artist covers various things
(walls, floors, dishes) with the <a href="https://en.wikipedia.org/wiki/Einstein_problem">aperiodic monotile</a>
known as the “hat.” The hat itself is a recent discovery — it was first discovered in 2022 and announced
publicly in March 2023.</p>

<p>ArtsWestchester’s <a href="https://artswestchester.org/gallery-exhibit/the-janet-langsam-vault-project-continuum-terra-by-rana-amirtahmasebi/">official gallery page</a>
inexplicably displays an AI-generated image of some bullshit, rather than Amirtahmasebi’s actual work.
What, does nobody at ArtsWestchester own a camera?
Top: ArtsWestchester’s AI slop. Middle and bottom: The real-life vault, with hat pattern.</p>

<table>
  <tbody>
    <tr>
      <td><img src="/blog/images/2026-07-01-ai-slop.jpg" alt="" width="640" /></td>
    </tr>
    <tr>
      <td><img src="/blog/images/2026-07-01-amirtahmasebi1.jpg" alt="" width="640" /></td>
    </tr>
    <tr>
      <td><img src="/blog/images/2026-07-01-amirtahmasebi2.jpg" alt="" width="640" /></td>
    </tr>
  </tbody>
</table>

<p>Now, the hat will tile the plane, but you’ll have trouble tiling a curved surface (such as
Amirtahmasebi’s lumpy pottery). Her solution was in some cases to deform or truncate the hat, and in
other cases to just give up and stop tiling. It wasn’t mathematically satisfying at all. But I liked
seeing the hat in the wild, anyway.</p>

<hr />

<p>See also:</p>

<ul>
  <li><a href="/blog/2026/05/08/two-minute-iolanthe/">“Two-Minute <em>Iolanthe</em>”</a> (2026-05-08)</li>
  <li><a href="/blog/2023/03/30/hat-parquet/">“Escheresque parquet deformations of an aperiodic monotile”</a> (2023-03-30)</li>
</ul>]]></content><author><name></name></author><category term="ai" /><category term="blog-roundup" /><category term="gilbert-and-sullivan" /><category term="linguistics" /><category term="litclub" /><category term="math" /><category term="theater" /><summary type="html"><![CDATA[First images of PHerc. 1667. When Vesuvius buried Herculaneum, it turned many papyrus scrolls in the Villa dei Papiri to burnt hunks of carbon without destroying their physical structure. Since the 2010s (or earlier?), people have tried to non-invasively image what remains of the scrolls. In June 2026, the latest “Vesuvius Challenge” prize was awarded to a team who successfully imaged the first “complete” scroll. The team’s report (“Complete virtual unwrapping and reading of a rolled Herculaneum papyrus”, Angelotti et al., 2026) points out that the scroll is even less “complete” than it used to be: invasive efforts in the late 20th century had already reduced it from about 14 grams of carbonized gunk to about 6 grams. The group’s full transcription consists of only 300 to 400 complete words. They identify PHerc. 1667 as some sort of philosophical treatise — unsurprising, as many of the scrolls that could already be deciphered turned out to be works of Philodemus. Contrary to some media reports, the title of PHerc. 1667’s work is unknown; but a separate finding reported in the same paper identifies PHerc. 139 as book 8 of Philodemus’s On gods (περὶ θεῶν, book Η).]]></summary></entry><entry><title type="html">Katakana and Cypriot</title><link href="https://quuxplusone.github.io/blog/2026/06/12/syllabaries/" rel="alternate" type="text/html" title="Katakana and Cypriot" /><published>2026-06-12T00:01:00+00:00</published><updated>2026-06-12T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/06/12/syllabaries</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/06/12/syllabaries/"><![CDATA[<p>From Louis Godart’s <em>The Phaistos Disc: The Enigma of an Aegean Script</em> (1994,
tr. Alexandra Doumas):</p>

<blockquote>
  <p>Whoever studies the history of writing, ancient or modern, should be mindful of
one basic methodological principle: a comparison between the signs encountered
in different scripts should always be treated with skepticism and subjected
to severe criticism. There are plenty of examples of signs that are graphically
the same, and indeed have the same phonetic value, in scripts that have
absolutely nothing in common. A case in point are the nine signs in the classical
Cypriot syllabic script, in use on Cyprus until the fourth century BC, and
modern Japanese. The signs YE [<em>sic</em>], VE [<em>sic</em>], RO, SE, TO, KO, RU, ME, and PE are written
in exactly the same way in both, without anyone ever even imagining an affinity
between the script of ancient Cyprus and the <em>kana</em> script of Japan.</p>
</blockquote>

<p>These days both <a href="https://en.wikipedia.org/wiki/Katakana_(Unicode_block)">katakana</a>
and the <a href="https://en.wikipedia.org/wiki/Cypriot_syllabary">Cypriot syllabary</a>
are encoded in Unicode, so it’s convenient to present the following table of glyphs
that (according to their Unicode character names) represent the “same” phonetic values:</p>

<table>
  <thead>
    <tr>
      <th>Cypriot</th>
      <th>Kana</th>
      <th>Value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>𐠀</td>
      <td>ア</td>
      <td>A</td>
    </tr>
    <tr>
      <td>𐠊</td>
      <td>カ</td>
      <td>KA</td>
    </tr>
    <tr>
      <td>𐠔</td>
      <td>マ</td>
      <td>MA</td>
    </tr>
    <tr>
      <td>𐠙</td>
      <td>ナ</td>
      <td>NA</td>
    </tr>
    <tr>
      <td>𐠞</td>
      <td>パ</td>
      <td>PA</td>
    </tr>
    <tr>
      <td>𐠣</td>
      <td>ラ</td>
      <td>RA</td>
    </tr>
    <tr>
      <td>𐠨</td>
      <td>サ</td>
      <td>SA</td>
    </tr>
    <tr>
      <td>𐠭</td>
      <td>タ</td>
      <td>TA</td>
    </tr>
    <tr>
      <td>𐠲</td>
      <td>ワ</td>
      <td>WA</td>
    </tr>
    <tr>
      <td>𐠼</td>
      <td>ザ</td>
      <td>ZA</td>
    </tr>
    <tr>
      <td>𐠁</td>
      <td>エ</td>
      <td>E</td>
    </tr>
    <tr>
      <td>𐠋</td>
      <td>ケ</td>
      <td>KE</td>
    </tr>
    <tr>
      <td>𐠕</td>
      <td>メ</td>
      <td><b>ME</b></td>
    </tr>
    <tr>
      <td>𐠚</td>
      <td>ネ</td>
      <td>NE</td>
    </tr>
    <tr>
      <td>𐠟</td>
      <td>ペ</td>
      <td><b>PE</b> (cf. katakana ヘ, “HE”)</td>
    </tr>
    <tr>
      <td>𐠤</td>
      <td>レ</td>
      <td>RE</td>
    </tr>
    <tr>
      <td>𐠩</td>
      <td>セ</td>
      <td><b>SE</b></td>
    </tr>
    <tr>
      <td>𐠮</td>
      <td>テ</td>
      <td>TE</td>
    </tr>
    <tr>
      <td>𐠳</td>
      <td>ヱ</td>
      <td><b>WE</b> (cf. katakana エ, “E”)</td>
    </tr>
    <tr>
      <td>𐠂</td>
      <td>イ</td>
      <td>I</td>
    </tr>
    <tr>
      <td>𐠌</td>
      <td>キ</td>
      <td>KI</td>
    </tr>
    <tr>
      <td>𐠖</td>
      <td>ミ</td>
      <td>MI</td>
    </tr>
    <tr>
      <td>𐠛</td>
      <td>ニ</td>
      <td>NI</td>
    </tr>
    <tr>
      <td>𐠠</td>
      <td>ピ</td>
      <td>PI</td>
    </tr>
    <tr>
      <td>𐠥</td>
      <td>リ</td>
      <td>RI</td>
    </tr>
    <tr>
      <td>𐠪</td>
      <td>シ</td>
      <td>SI</td>
    </tr>
    <tr>
      <td>𐠯</td>
      <td>チ</td>
      <td>TI</td>
    </tr>
    <tr>
      <td>𐠴</td>
      <td>ヰ</td>
      <td>WI</td>
    </tr>
    <tr>
      <td>𐠃</td>
      <td>オ</td>
      <td>O</td>
    </tr>
    <tr>
      <td>𐠍</td>
      <td>コ</td>
      <td><b>KO</b></td>
    </tr>
    <tr>
      <td>𐠗</td>
      <td>モ</td>
      <td>MO</td>
    </tr>
    <tr>
      <td>𐠜</td>
      <td>ノ</td>
      <td>NO</td>
    </tr>
    <tr>
      <td>𐠡</td>
      <td>ポ</td>
      <td>PO</td>
    </tr>
    <tr>
      <td>𐠦</td>
      <td>ロ</td>
      <td><b>RO</b></td>
    </tr>
    <tr>
      <td>𐠫</td>
      <td>ソ</td>
      <td>SO</td>
    </tr>
    <tr>
      <td>𐠰</td>
      <td>ト</td>
      <td><b>TO</b></td>
    </tr>
    <tr>
      <td>𐠵</td>
      <td>ヲ</td>
      <td>WO</td>
    </tr>
    <tr>
      <td>𐠿</td>
      <td>ゾ</td>
      <td>ZO</td>
    </tr>
    <tr>
      <td>𐠄</td>
      <td>ウ</td>
      <td>U</td>
    </tr>
    <tr>
      <td>𐠎</td>
      <td>ク</td>
      <td>KU</td>
    </tr>
    <tr>
      <td>𐠘</td>
      <td>ム</td>
      <td>MU</td>
    </tr>
    <tr>
      <td>𐠝</td>
      <td>ヌ</td>
      <td>NU</td>
    </tr>
    <tr>
      <td>𐠢</td>
      <td>プ</td>
      <td>PU</td>
    </tr>
    <tr>
      <td>𐠧</td>
      <td>ル</td>
      <td><b>RU</b></td>
    </tr>
    <tr>
      <td>𐠬</td>
      <td>ス</td>
      <td>SU</td>
    </tr>
    <tr>
      <td>𐠱</td>
      <td>ツ</td>
      <td>TU</td>
    </tr>
  </tbody>
</table>

<p>See also a nice diagram of a few of these on <a href="https://air.unimi.it/retrieve/dfa8b990-b058-748b-e053-3a05fe0a3a96/phd_unimi_R08526.pdf">page 11</a>
of Francesco Soldani’s doctoral thesis “Interconnessione grafica tra i vari sillabari egei e loro leggibilità”
(University of Milan, 2013).</p>]]></content><author><name></name></author><category term="linguistics" /><category term="typography" /><summary type="html"><![CDATA[From Louis Godart’s The Phaistos Disc: The Enigma of an Aegean Script (1994, tr. Alexandra Doumas):]]></summary></entry><entry><title type="html">C++26 Reflection gives us universal template parameters</title><link href="https://quuxplusone.github.io/blog/2026/06/07/meta-to/" rel="alternate" type="text/html" title="C++26 Reflection gives us universal template parameters" /><published>2026-06-07T00:01:00+00:00</published><updated>2026-06-07T00:01:00+00:00</updated><id>https://quuxplusone.github.io/blog/2026/06/07/meta-to</id><content type="html" xml:base="https://quuxplusone.github.io/blog/2026/06/07/meta-to/"><![CDATA[<p>Keenan Horrigan on the std-proposals mailing list <a href="https://lists.isocpp.org/std-proposals/2026/06/18544.php">pointed out</a>
an interesting consequence of C++26 Reflection: it seems to give us “universal template parameters”
almost for free.</p>

<p>The STL sometimes tries to pretend we have “universal template parameters” by overloading templates
with the same name. For example, we have both <code class="language-plaintext highlighter-rouge">std::get&lt;T&gt;(tp)</code> taking a type and <code class="language-plaintext highlighter-rouge">std::get&lt;I&gt;(tp)</code>
taking an integer; but these are just two completely different signatures of <code class="language-plaintext highlighter-rouge">std::get</code> in the same overload
set. Likewise in C++23 you can write either <code class="language-plaintext highlighter-rouge">rg | ranges::to&lt;std::vector&lt;int&gt;&gt;()</code> (where the argument to
<code class="language-plaintext highlighter-rouge">to</code> is a type) or <code class="language-plaintext highlighter-rouge">rg | ranges::to&lt;std::vector&gt;()</code> (where the argument is a class template).
Again this is accomplished with an overload set — roughly like this (modulo I’ve totally mangled
the actual job of <code class="language-plaintext highlighter-rouge">ranges::to</code>, which is generally <em>not</em> to forward its arguments to <code class="language-plaintext highlighter-rouge">To</code>’s constructor):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>template&lt;class To, class... Args&gt;  // #1
auto rangish_to(Args&amp;&amp;... args) {
  return To(std::forward&lt;Args&gt;(args)...);
}
template&lt;template&lt;class...&gt; class To, class... Args&gt;  // #2
auto rangish_to(Args&amp;&amp;... args) {
  return To(std::forward&lt;Args&gt;(args)...);
}

int *a, *b;
auto x = rangish_to&lt;std::vector&lt;int&gt;&gt;(a, b);      // OK, #1
auto y = rangish_to&lt;std::vector&gt;(a, b);           // OK, #2
</code></pre></div></div>

<p>But even this overload set won’t accept a caller like:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>auto z = rangish_to&lt;std::ranges::subrange&gt;(a, b); // error
</code></pre></div></div>

<p>because <code class="language-plaintext highlighter-rouge">std::ranges::subrange</code> as a template argument matches neither <code class="language-plaintext highlighter-rouge">class To</code> nor
<code class="language-plaintext highlighter-rouge">template&lt;class...&gt; class To</code>. It’s actually a class template of two type parameters and a constant!
(<a href="https://en.cppreference.com/cpp/ranges/subrange">cppreference.</a>)</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>enum class subrange_kind : bool {
  unsized,
  sized,
};
template&lt;
  input_or_output_iterator I,
  sentinel_for&lt;I&gt; S = I,
  subrange_kind K = sized_sentinel_for&lt;S, I&gt; ? sized : unsized&gt;
class subrange { ~~~~ };
</code></pre></div></div>

<p>We could accept <code class="language-plaintext highlighter-rouge">subrange</code> ad-hoc via a third overload:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>template&lt;template&lt;class,class,auto&gt; class To, class... Args&gt;  // #3
auto rangish_to(Args&amp;&amp;... args) {
  return To(std::forward&lt;Args&gt;(args)...);
}
</code></pre></div></div>

<p>but in general there’s no way to write out the set of <em>all possible</em> kinds of
class templates, so we can’t make our <code class="language-plaintext highlighter-rouge">rangish_to</code> accept all of them.</p>

<blockquote>
  <p>You might point out that the real <code class="language-plaintext highlighter-rouge">ranges::to</code> wouldn’t accept <code class="language-plaintext highlighter-rouge">subrange</code> anyway, because the real
<code class="language-plaintext highlighter-rouge">ranges::to</code> accepts only containers like <code class="language-plaintext highlighter-rouge">vector</code>, not views like <code class="language-plaintext highlighter-rouge">subrange</code> or <code class="language-plaintext highlighter-rouge">span</code>. However,
this deficiency is likely to be <a href="/blog/2019/08/02/the-tough-guide-to-cpp-acronyms/#dr">DR’ed</a>
in the near future thanks to Hewill Kang’s well-received
<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3544r0.html">P3544 “<code class="language-plaintext highlighter-rouge">ranges::to&lt;view&gt;</code>.”</a></p>
</blockquote>

<p>C++26 Reflection to the rescue! C++26 Reflection is “untyped”: it uses
<a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2996r13.html#why-a-single-opaque-reflection-type">a single type</a>
<code class="language-plaintext highlighter-rouge">std::meta::info</code> to represent the reflections of every kind of thing
in the language. Therefore a template parameter of type <code class="language-plaintext highlighter-rouge">meta::info</code> alone can represent
<code class="language-plaintext highlighter-rouge">std::vector</code>, <code class="language-plaintext highlighter-rouge">std::ranges::subrange</code>, <code class="language-plaintext highlighter-rouge">std::array</code>, or anything else (<code class="language-plaintext highlighter-rouge">std::vector&lt;int&gt;</code>,
<code class="language-plaintext highlighter-rouge">size_t</code>, <code class="language-plaintext highlighter-rouge">42</code>, <code class="language-plaintext highlighter-rouge">std::ignore</code>…) and so we can write a single function template like this
(<a href="https://godbolt.org/z/czYzKEczT">Godbolt</a>):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>template&lt;std::meta::info To, class... Args&gt;
auto meta_to(Args&amp;&amp;... args) {
  return typename [:To:](std::forward&lt;Args&gt;(args)...);
}

auto x = meta_to&lt;^^std::vector&lt;int&gt;&gt;(a, b);      // OK
auto y = meta_to&lt;^^std::vector&gt;(a, b);           // OK
auto z = meta_to&lt;^^std::ranges::subrange&gt;(a, b); // OK!
</code></pre></div></div>

<p>For the cost of two characters <code class="language-plaintext highlighter-rouge">^^</code> (and a really cryptic error message if you forget
the <code class="language-plaintext highlighter-rouge">typename</code> keyword), C++26 seems to have given us universal template parameters!</p>

<p>(Does this mean <a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2989r2.pdf">P2989 “Universal template parameters”</a>
is obsolete? IMHO, yes. But I can see how one might debate it: those two <code class="language-plaintext highlighter-rouge">^^</code> characters
<em>are</em> kind of ugly.)</p>]]></content><author><name></name></author><category term="class-template-argument-deduction" /><category term="paradigm-shift" /><category term="ranges" /><category term="reflection" /><category term="templates" /><summary type="html"><![CDATA[Keenan Horrigan on the std-proposals mailing list pointed out an interesting consequence of C++26 Reflection: it seems to give us “universal template parameters” almost for free.]]></summary></entry></feed>