There's a ... "content creator"? That I like. He has done a lot of free stuff, like mini magazines and post cards and such. I like his sense of humor and his creativity. (I even had one of my awesome artworks in one of his awesome zines.) He lifted my and my wife's spirits when COVID was scary.
This is not Internet stuff. It's actual paper. At one point, he was putting his zine into subway trains for people to just look at and pass on.
His latest project is not free. He is selling a full-size magazine for $10, plus shipping. I haven't seen it yet. I have no idea what it will have. And I don't need to know - I am confident that I will be pleased with it. But I'm not you. I'm ... different. You might pay him $10 and hate it. And hate me. And hate the haters. And the lovers. And all the puppies and kitties. Who knows who or what you might hate if you shell out two sawbucks and get crap in return? Might be an interesting experiment ... maybe we should hope for disappointment, just to see.
Anyway, if you're interested, go to https://thewastrelstore.com/
Monday, August 18, 2025
Funny Person
Thursday, August 14, 2025
Simple C REPL
I'm a fan of language REPLs (Read, Evaluate, Print, Loop). These are interactive programs that let you experiment with the language. For example, running the Python REPL let's you enter Python code interactively and get immediate output. No edit/compile/run cycle. REPLs are useful for experimenting with language features, exploring APIs, reproducing bugs, etc.
But I'm a C programmer, and C doesn't have a REPL. And sometimes I just want to explore details of the language, like sign extension rules and implicit type conversions. C just isn't well-suited to having a REPL.
But since when has "not well-suited" ever stopped me?
Introducing crepl.sh : https://github.com/fordsfords/crepl
The doc is fairly comprehensive (Thanks Claude!), so I'll just show an annotated sample session:
$ ./crepl.sh C REPL - Enter C statements or expressions Type !help for commands c> int x = 1; c> x -- Omit semicolon to auto-print the expression. i 1 (0x00000001) -- The leading "i" indicates type, not the variable name c> unsigned short j = 2 -- A declaration is not a legal expression; no autoprint! Compilation error, line rejected. Enter '!errs' for details. c> unsigned short j = 2; -- Semicolon suppresses autoprint c> j us 2 (0x0002) -- Autoprint knows its an unsigned short. c> x+j i 3 (0x00000003) c> j=j+1 -- An assignment statement is an expression. us 3 (0x0003) c> char c = -1; c> c c -1 (0xff) c> x = c i -1 (0xffffffff) -- Nice sign extension! c> int inc(int x) { x++; return x; }; -- Define a function all on a single line. c> inc(88) i 89 (0x00000059) c> x i -1 (0xffffffff) -- Naturally "inc()" has its own local x. c> int inc_x() { ++x; }; -- New funct. Oops, I forgot to return something. c> int inc_x() { ++x; return x; }; -- Fix the funct? No, you can't re-define it. Compilation error, line rejected. Enter '!errs' for details. c> !vi -- This edits the code so far. I deleted inc_x(). c> int inc_x() { ++x; return x; }; -- Now I can define it properly. c> inc_x() i 0 (0x00000000) -- It treated x as a global. But is it? c> inc_x() i 1 (0x00000001) c> x i 1 (0x00000001) c> !help Commands: !help - Show this help. !errs - Show compilation/runtime errors from last attempt. Note that line numbers refer to the 'crepl_temp.c' file. !new - Clear all accumulated code. !list - Show current accumulated code. !vi - Edit accumulated code in vi. !source filename - read input from filename. !sh - start an interactive subshell. Exit shell to return to crepl. !quit - Exit the REPL Autoprint types handled: char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double c> !list Current code: int x = 1; x; unsigned short j = 2; j; x+j; j=j+1; char c = -1; c; x = c; int inc(int x) { x++; return x; }; inc(88); x; ; int inc_x() { ++x; return x; }; inc_x(); inc_x(); x; c> !quit Goodbye!
So, is the variable 'x' a global? The inc_x() function incremented it, so it must be, right? (Spoiler, it's not. See this doc for explanation.)