GRWL
A little-documented procedural language for laying out printed reports - point sizes, ink colours, running page headers - known today almost entirely from one 99 Bottles of Beer program submitted in 2006
Created by Not publicly documented - the only surviving program was submitted under the user name 'antonyclark', which identifies the submitter, not necessarily the language's designer
GRWL is a procedural language for producing formatted printed output. Its statements set type sizes, choose ink colours, define running page headers and break text into paragraphs, and they mix all of this with ordinary loops, conditionals and procedures. The one surviving expansion of the name is Graphic Report Writing Language. Almost everything else about it has been lost. No manual, implementation, vendor, or named designer could be found. The language is known from a single artifact: a 99 Bottles of Beer program submitted to 99-bottles-of-beer.net in 2006. That program says more about the language than any catalog entry. This page describes what the program shows, labels inferences as inferences, and corrects the parts of the catalog record that the program contradicts.
What the record says
The encyclopedia catalog that lists GRWL records the following:
| Field | Recorded value | What the evidence supports |
|---|---|---|
| Name | GRWL | Confirmed by the 99 Bottles entry |
| Year | 1985 | Unconfirmed; the earliest datable trace is 2006 |
| Paradigm | Procedural | Consistent with the surviving program |
| Category | Robotics | Contradicted - the surviving program formats a printed document and contains no motion, sensor, or device commands |
| Status | Historical | Plausible; no current implementation or community is visible |
The “Robotics” label is the clearest problem. Nothing in the one known GRWL program has anything to do with robots or machine control. Its vocabulary is that of typesetting and report generation: pointsize, ink, page head, fill, para. That fits the “Graphic Report Writing Language” expansion. Where the robotics classification came from is unknown. It may be confusion with one of the robot programming languages of the 1980s, many of which had similar short acronyms. The 1985 date may also be approximate. The catalog cites no source for it.
History & Origins
The name
The only source that expands “GRWL” is the acronym dictionary AcronymFinder. Its entry reads “Graphic Report Writing Language” and is flagged as a definition that “appears very rarely”. The Wayback Machine first captured it on 17 November 2011. It cites no source and gives no date, vendor, or platform. It matches the surviving program closely, but it is a single unsourced dictionary entry, and this page treats it as probable, not proven.
The phrase “report writer” had a specific meaning in the 1970s and 1980s. A report writer was a tool or sub-language for turning records into formatted printed pages, with headings, page breaks, totals and column layout. COBOL had a Report Writer module, and many database and fourth-generation products shipped their own report languages. A graphic report writing language would plausibly have added control over typefaces, sizes and colours. That became newly practical in the mid-1980s, when laser printers and page-description languages brought typeset-quality output to office computers. This context fits the recorded 1985 date, but it does not confirm it.
The 99 Bottles program
The program was published on 99-bottles-of-beer.net, the long-running collection of programs that print the “99 Bottles of Beer” song in as many languages as possible. It was entry 1039, dated 02/01/06, credited to the user “antonyclark”, and filed under the site’s “real language” category rather than “esoteric language”. The page gives no description of the language, no link to an implementation, and no information about its origin. Wayback captures from April 2006 to December 2023 show the same program with no reader comments.
| |
GRWL “99 Bottles of Beer”, 99-bottles-of-beer.net entry 1039 (2006), as preserved by the Wayback Machine.
The submitter’s user name is the only person connected to GRWL anywhere in the public record. Whether “antonyclark” designed the language, worked with it in a job, or simply remembered it is not stated.
Design Philosophy
Without documentation, GRWL’s design goals have to be read from the program. One idea stands out: output is the default action. A string literal, a number, or a procedure call standing alone in the code does not need a print statement. It is written straight onto the page. Typographic settings are just more statements in the same stream. The program reads less like code that produces a report and more like a description of the report itself, with control flow inserted where the content repeats or varies.
The same approach underlies template and report languages from troff macros to later web templating systems, where the document is the program. GRWL applies it with the full set of procedural tools: variables, counted loops, multi-way conditionals and parameterised procedures.
Key Features
Everything in this section is inferred from the single surviving program. The program was not run, because no implementation exists. These readings are interpretations of how the code must behave to print the song correctly, not documented semantics.
| Construct | Example from the program | Apparent meaning |
|---|---|---|
| Scoped binding | for N = 99, for $b = "bottle" | for binds a name for the rest of a block |
| Scoped setting | for pointsize 16 ..., for ink(...) | The same for keyword applies a typographic setting to a block |
| Counted loop | for b = N to 0 by -1 | BASIC-like loop with an explicit step |
| Block close | next | Closes one for, whether it is a loop, a binding, or a setting |
| Conditional | if ... elif ... else ... fi | Multi-way conditional closed by fi, as in ALGOL 68 and the Bourne shell |
| Word comparisons | eq, ge | Comparison operators written as words, not symbols |
| String variables | $b, $d | String variables carry a $ prefix; numeric ones (N, b, n, i) do not |
| Implicit output | " of " $d " on the wall, " | Adjacent literals, variables and calls are emitted in sequence |
| Running header | page head ( ... ) | A block printed at the top of each page |
| Page state | if continued ... fi | A condition that appears to be true on pages after the first, so later pages show “continued..” |
| Typography | pointsize 16, ink(red), fill*1, para | Type size, ink colour, a spacing or line-fill command with a multiplier, and a paragraph break |
| Procedures | procedure ss(n,i) ( ... ) | Named procedures with parameters and a parenthesised body, whose output is emitted where they are called |
for and next as a general scoping pair
The most unusual feature is how the program uses for. In most languages that have it, for only introduces a loop. In this program, the five for statements do three different things:
- three bind variables (
N,$b,$d), - one sets an ink colour,
- one is a counted loop.
There are also exactly five nexts: next next after the verse closes the loop and the ink setting, and next next next closes the three bindings. This suggests that GRWL treats for as a general “with this in effect, do the following” construct, closed by next, and treats a loop as just one kind of scope. The ink setting is a good example. It is re-evaluated on every pass of the loop, turning the final “No more bottles” verse red while the others stay black.
Conditionals with empty branches
The procedure ss ends with if n eq 1 else "s" fi. The then branch is empty, so the procedure emits nothing when there is exactly one bottle and an “s” otherwise. The same procedure handles the song’s other irregular cases. Its second parameter switches between “No more” at the start of a line and “no more” mid-line. When the count goes negative after the last verse, it falls through to else N fi and prints 99 again, for “99 bottles of beer on the wall”.
Evolution
No versions, releases, or changes to GRWL are documented. Even the language’s lifespan is uncertain. It is recorded as appearing around 1985, and the catalog that lists it gives 1995 as its last commercial year. Neither date has been confirmed. The only firm point is that the language was still remembered well enough in early 2006 (the entry is dated “02/01/06”, which could be read as either 1 February or 2 January) for someone to write a correct, idiomatic program in it.
Current Relevance
GRWL has no known implementation, users, or documentation. 99-bottles-of-beer.net, which held the language’s only public trace, no longer resolves, and entry 1039 now exists only in the Wayback Machine. Searches for this article covered:
- the general web and DuckDuckGo,
- FOLDOC and the HOPL online history of programming languages,
- the Google Books API,
- the Internet Archive’s metadata and full-text search over scanned magazines and books.
None of them found a manual, a product listing, an advertisement, or a mention of the language. Searches for “GRWL” mostly return the unrelated Global River Widths from Landsat database, an earth-science dataset that shares the acronym.
Not to be confused with
| Name | What it is | Why it is not this language |
|---|---|---|
| GRWL (Global River Widths from Landsat) | A global database of river widths derived from Landsat imagery, published in 2018 | A geoscience dataset, not a programming language |
| GRL (Generic Robot Language) | Ian Horswill’s language for behaviour-based robot control, embedded in Scheme, at Northwestern University | A different name and a functional rather than procedural design, but the closest real robotics language to GRWL’s catalog classification |
Why It Matters
GRWL is a reminder of how much of computing history lived inside products and workplaces and was never written down where the public could find it. Report languages like it were once common. Many database systems, accounting packages and minicomputer environments had their own. They were learned on the job, documented in manuals that shipped in binders, and abandoned when the product was. Few were ever described in a paper, and fewer still reached the language catalogs.
In GRWL’s case, a single person submitting one program to a hobby website in 2006 preserved more of the language than any other source. That program is complete enough to show a distinctive design: for as a general scoping construct, implicit output, and typographic settings as ordinary statements. It also shows that a catalog entry with a date, a paradigm and a category can still be wrong about what a language was for. If the original manual or software turns up, the 99 Bottles program will be the way to check it.
Sources
- 99-bottles-of-beer.net, “Language GRWL”, entry 1039 (dated 02/01/06), via the Wayback Machine, April 2006 capture and December 2023 capture
- AcronymFinder, “GRWL - Graphic Report Writing Language”, via the Wayback Machine, November 2011 capture
- Northwestern University Autonomous Mobile Robot Group, GRL project description