Terrible life choices gave Connie Lam a mountain of debt. The most recent poor decision left her as the lead suspect in a murder case.

Club Contango (Tracerverse, volume 2) by Eliane Boey
You can imagine this Friday Five set to the Thunderbirds theme if you like. :-)

5. Name five favourite movies.
Tremors. And then watching Tremors four more times.
I'm not rly into films, except film festivals that give me insights into Other people's lives. I'm more of a book person.

4. Name four areas of interest you became interested in after you were done with your formal education.
Not after but aside from the usual primary to tertiary educational course:
Ethical philosophy, palaeontology, geology, botany, and entomology.
If we count school history as bleeding into archaeology, and English literature as a springboard to poetry even though we didn't study poetry beyond a couple of war poems.

3. Name three things you would change about this world.
Setting aside sensible answers, as everyone already knows we need to redistribute wealth through taxation, tackle climate change and environmental degradation, end wars, and improve human health....
Here are my spur of the moment trivial desires:
a. Clouds are fabulous but don't you get a bit bored with blue skies all the time? Isn't this why people enjoy transient optical phenomena such as rainbows and sundogs &c so much? Maybe one day a week the sky could be a random colour? Nothing too dark or bright, just pastel pink or patchwork greens or polkadots on the blue?
b. Compulsory feeding stations for blood-sucking insects. Honestly, I'd donate to a blood bank to stop the little menaces injecting me with their toxins and allergens. Also, no more mosquito or tick diseases for humans and dogs, which is surely worth the effort?
c. Everyone gets one disability redacted if they please, after a month of time for consideration. I just want to be able to eat food like a normal human. Also, you can give your one redaction away but it just disappears into a general pool which is infallibly distributed on the basis of need. This idea needs work but basically I just selfishly want to be able to go out or go away and eat whatever is put in front of me instead of having to fuss.

2. Name two of your favourite childhood toys.
The countryside. My friends.

1. Name one person you could be handcuffed to for a full day.
Are you 'king kidding me?! I can barely cope with a cannula!

0. And your good selves? Meme me, memsaabs.
Tags:
A long time ago I wrote on twitter (now erased): "surprising how much computer stuff makes sense viewed as tragic deprivation of sum types".

Sum types (a.k.a. disjoint unions a.k.a. tagged unions a.k.a. safe variant types) are of course wonderful and nice and everyone should have them. ML and Haskell have them, and now Rust has them, as does Swift, and Scala with case classes, and C++ kinda with std::variant, and .. lots of modern languages are growing them. Great, hurrah.

But there is just a little bit of subtlety to doing them right. The subtlety is that you have to build the language to couple together two pieces of data -- a tag (or "discriminant") and an unsafe union -- with mandatory syntactic constructs (switch or match expressions) so that you only get to access the unsafe union elements when you've already checked the tag, and the type system and name resolution systems know you're in a given case-block, and so only let you access to the union-fields (properly typed) corresponding to the tag case. It's not a hugely complex thing to get right, but you have to get it right.

There are three main degenerate ways you can fail to get it right.

  1. You can give users syntactically unguarded access to union members, say by using container.field syntax, in which case all you can do if the tag doesn't match that field at runtime is to raise a runtime error, which you can at least do systematically, but the ergonomics are lousy: it's inefficient (you wind up checking twice) and it doesn't help the user avoid the runtime error by statically forcing cases to be handled.

  2. You can do #1 but then also fail to even raise a runtime error when the tag is wrong. At which point the tag is basically "advisory", so then...

  3. You can even go a step further than #2 and not even require users to declare a tag. Just let the user "know the right case" using some unspecified method, an invariant they have to track themselves. They can use a tag if they like, or some bits hidden somewhere else, who knows.


Ok so .. Casey Muratori gave a great recent talk on the origin of, well, certain OOP-y habits of encapsulation, which is mostly about Entity-Component-System organization, but .. also a bit about sum types. He spent a lot of time digging in the PL literature and reconstructing the history of idea transmission. I just watched it, and it's a great talk and you should go watch it, it's here:



One of the things he discusses in here is that safe and correctly-designed disjoint unions aren't just an ML thing, they were around in the early 60s at least. Wikipedia thinks Algol 68. Muratori places their origin in Doug Ross and/or Tony Hoare talking about amendments to Algol 60, linking to this Tony Hoare paper but of course Hoare references PL/I there and I'm honestly not sure about the exact origin, it's somewhere around there. Point being it predates ML by probably a decade.

But another thing Muratori points out is that is that Dahl and Nygaard copied the feature in safe working form into Simula, and Stroustrup knew about it and intentionally dropped it from C++, thinking it inferior to the encapsulation you get from inheritance. This is funny! Because of course C already had case #3 above -- completely unchecked/unsafe unions, they only showed up in 1976 C, goodness knows why they decided on that -- and the safe(ish) std::variant type has taken forever to regrow in C++.

I was happy to hear this, because it mirrors to some extent another funny story I have reconstructed from my own digging in the literature. Namely about the language Mesa, a Butler Lampson project from PARC, very far ahead of its time too. There's far too much to discuss about Mesa to get into here -- separate compilation, interface/implementation splits, etc. -- but it did also have safe variant types (along with a degenerate form called "computed" which is unsafe). Presumably it picked them up from Algol 68, or Simula 67, or one of probably dozens of languges in the late 60s / early 70s it emerged from. No big deal.

Where that relatively unremarkable fact turns into a funny story is during a "technology transfer" event that happened during Mesa's life: Niklaus Wirth took a sabbatical to PARC, and became quite enamoured with Mesa, and went back home to work on what became Modula and eventually Modula 2. But Modula 2 had only degenerate variant types! He copied them not from Mesa, but in the same busted form they existed in Pascal, completely missing that Mesa did them correctly. Modula 2 variants are degenerate case #1 above (if you turn on a special checking compilation mode) otherwise case #2: tags declared but no checking at all! He even writes it up in the report on Modula 2 and Oberon, criticizing its lack of safety while simultaneously citing all the ways Mesa influenced his design. Evidently not enough.

Anyway, all this is to say: language features are easily broken, mis-copied, forgotten or intentionally omitted due to the designer's pet beliefs. Progress is very circuitous, if it exists at all!
ffutures: (Default)
([personal profile] ffutures Jul. 17th, 2025 06:12 am)
This is an offer for the Battlezoo Bundle, featuring Fifth Edition monsters and monster hunters from Roll for Combat. This offer helps Roll for Combat as it deals with the creditors of bankrupt Diamond Comic Distributors, who have seized many publishers' unsold stock.

 https://bundleofholding.com/presents/Battlezoo



This isn't really my sort of thing, since I don't play any relevant system, but it does suggest an often overlooked twist on fantasy monsters for anyone who needs it - hunting them down for potions ingredients and magical raw materials, rather than killing them to get past them and find treasure. Of course this probably pushes the species towards extinction, but maybe someone will write up a gamekeeper / conservation organization for this, or something like PETA or the RSPCA working to see monsters killed humanely...
Tags:
james_davis_nicoll: (Default)
([personal profile] james_davis_nicoll Jul. 16th, 2025 02:17 pm)


The Battlezoo Bundle presents the Battlezoo line of monsters and monster hunters from Roll for Combat for D&D 5E and compatible tabletop roleplaying systems, compiled from winning designs from the annual RPG Superstars competition.

Bundle of Holding: Battlezoo


The only fate more glorious than dying for the uncaring empire is dying over and over for the uncaring empire.

Red Sword by Bora Chung (Translated by Anton Hur)


An intelligent ship crisscrosses space-time to track the progress of the colonies it established

A Maze of Stars by John Brunner
james_davis_nicoll: (Default)
([personal profile] james_davis_nicoll Jul. 14th, 2025 11:43 pm)


May the prison you liberate have more than seven prisoners.


This new Hearts of Wulin Bundle presents Hearts of Wulin, the tabletop roleplaying game of Chinese wuxia action melodrama from Age of Ravens Games.

Bundle of Holding: Hearts of Wulin
ffutures: (Default)
([personal profile] ffutures Jul. 14th, 2025 06:32 pm)
This is an offer of Hearts of Wulin, featuring "the Apocalypse Engine game of Chinese wuxia melodrama."

https://bundleofholding.com/presents/HeartsOfWulin

 

The main game material was in a previous bundle, this bundle adds three new supplements, including one for running detective mysteries in the style of Judge Dee etc. The whole lot is very cheap, and for once I don't think it's going to be worth cherry-picking  if you're even slightly interested. I should probably add that I know very little about wuxia as a genre - there may be other games out there that handle it better.

Tags:
.