Kinton Ford’s Canto I

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.

Read More

A crosswording miscellany

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 […]

Read More

Interconverting std::function with copyable_function

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<bool()> remains implicitly convertible to copyable_function<void()>, contextually convertible to bool, and assignable from nullptr.)

Read More

Egerton MS 1995

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.

Read More

Some recent discoveries

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 Η).

Read More

The Book of St Albans (1486)

This week I read James Lipton’s An Exaltation of Larks; or, The Venereal Game (2nd edition, 1977), a discursive collection and celebration of “terms of venery” — the collective nouns like “school of fish” and “pride of lions” that were (so the story goes) mostly invented by medieval hunters who wanted to have their own proper jargon to distinguish the real hunters from the dilettantes.

Read More

ELF’s ways to combine potentially non-unique objects

Previously I wrote:

[Template parameter objects of array type] are permitted to overlap or be coalesced, just like initializer_lists and string literals. Clang trunk isn’t smart enough to coalesce potentially non-unique objects [but] GCC, once it implements define_static_array, will presumably make them the same.

Well, GCC 16 has an experimental implementation of define_static_array (compile with g++ -std=c++26 -freflection), and it does not coalesce template parameter objects of array type in the way I expected. Digging deeper into why not, I learned that there are at least three ways compilers and linkers (on ELF — that is, non-Windows — platforms) conspire to “merge” potentially non-unique objects:

  • Merging at the compiler level (for initializer_list backing arrays)
  • Sections with SHF_MERGE (for string literals and backing arrays)
  • Sections with SHF_GROUP, a.k.a. COMDAT sections (for inline variables)
Read More

Adventure: Is there light in the cobble crawl?

The original Colossal Cave Adventure consists basically of a Fortran source file and a textual data file. These files would often travel from one installation to another via paper printouts: printed out at one site, typed in by hand at another.

The lines of WOOD0350’s Fortran source (intentionally or not) never exceed 80 columns regardless of your tab stop. But the data file fits within 80 columns only with a tab stop of four. With an eight-space tab stop, four lines of the data file exceed 80 columns:

Read More

Adventure: Walking on the ceiling

On 2012-12-01 I wrote to Don Woods (in a postscript to a production update on Colossal Cave: The Board Game):

By the way, I just noticed last week that in “Adventure”, in the Hall of the Mountain King, the directions NORTH and LEFT are synonyms, as are SOUTH and RIGHT… as are WEST and FORWARD!  West being forward makes sense, if the Hall of Mists is back to the east; but for the rest I suppose the adventurer must be walking on the ceiling. :)  This little mixup is present all the way back to Crowther’s code. I just thought it was funny that nobody had commented on it before, as far as I know.

Read More

Things C++26 define_static_array can’t do

We’ve seen previously that it’s not possible to create a constexpr global variable of container type, when that container holds a pointer to a heap allocation. It’s fine to create a global constexpr std::array, or even a std::string that uses only its SSO buffer; but you can’t create a global constexpr std::vector or std::list (unless it’s empty) because it would have to hold a pointer to a heap allocation.

Read More

The “macro overloading” idiom

Here’s a neat trick to create an “overloaded macro” in C, such that M(x) does one thing and M(x, y) does something else. For example, we could make a macro ARCTAN such that ARCTAN(v) calls atan(v) and ARCTAN(y,x) calls atan2(y,x).

#define GET_ARCTAN_MACRO(_1, _2, x, ...) x
#define ARCTAN(...) GET_ARCTAN_MACRO(__VA_ARGS__, atan2, atan)(__VA_ARGS__)
Read More