HN user

RodgerTheGreat

7,273 karma

beyondloom.com

Posts41
Comments1,467
View on HN
itch.io 25d ago

Decker Fantasy Camp 2026

RodgerTheGreat
50pts9
beyondloom.com 1mo ago

Vector Graphics in Lil

RodgerTheGreat
57pts6
beyondloom.com 9mo ago

Yet another year with Decker

RodgerTheGreat
47pts3
itch.io 1y ago

Dec(k)-Month 2: A Decker Game Jam

RodgerTheGreat
33pts0
itch.io 2y ago

Decker Fantasy Camp 2024

RodgerTheGreat
2pts0
eggcorns.lascribe.net 2y ago

The Eggcorn Database

RodgerTheGreat
84pts37
maggieappleton.com 2y ago

Home-cooked software and barefoot developers

RodgerTheGreat
9pts1
beyondloom.com 2y ago

Lila: A Lil Interpreter in Posix Awk

RodgerTheGreat
67pts11
nsl.com 2y ago

K Isn't Lisp (2004)

RodgerTheGreat
51pts23
internet-janitor.itch.io 2y ago

WigglyPaint: A juicy, jiggly drawing program

RodgerTheGreat
166pts19
itch.io 2y ago

Deck-Month: a Decker game jam

RodgerTheGreat
41pts15
beyondloom.com 2y ago

The Lil Playground

RodgerTheGreat
1pts0
beyondloom.com 2y ago

The Life of Lil – Adventures in Cellular Automata

RodgerTheGreat
3pts0
itch.io 3y ago

Decker Fantasy Camp 2023

RodgerTheGreat
28pts1
github.com 3y ago

CardStock

RodgerTheGreat
101pts15
itch.io 3y ago

Octojam 9: The CHIP-8 game jam

RodgerTheGreat
41pts1
itch.io 4y ago

Octojam 8: The CHIP-8 game jam

RodgerTheGreat
1pts0
beyondloom.com 5y ago

DitherPaint: 1-Bit Sketching in the Browser

RodgerTheGreat
2pts0
internet-janitor.itch.io 5y ago

Squad: Forth on Chip-8

RodgerTheGreat
82pts12
octojam.com 5y ago

Octojam 7: The CHIP-8 game jam

RodgerTheGreat
84pts23
www.youtube.com 6y ago

Seeing what lives in a puddle by making a closed ecosystem (2019) [video]

RodgerTheGreat
11pts3
www.winestockwebdesign.com 6y ago

The Eternal Mainframe (2013)

RodgerTheGreat
2pts1
www.youtube.com 8y ago

How to solve a maze using shaders – Shadron tutorial [video]

RodgerTheGreat
16pts1
rootmos.io 9y ago

Implementing a K-like language targeting Malfunction

RodgerTheGreat
4pts0
github.com 9y ago

Trying.apl

RodgerTheGreat
3pts0
www.awfuljams.com 9y ago

Octojam 3: A CHIP-8 Game Jam

RodgerTheGreat
86pts13
nsl.com 10y ago

K isn't Lisp

RodgerTheGreat
2pts0
octojam.com 10y ago

Octo-Ber Jam 2: A CHIP-8 Game Jam

RodgerTheGreat
3pts0
github.com 11y ago

OK: An implementation of the K5 programming language

RodgerTheGreat
54pts9
octojam.com 11y ago

Octo-ber: A CHIP-8 Game Jam

RodgerTheGreat
4pts0

LLMs are in essence an attack on the concept of written language, harvesting and dissolving the social contract that underpins it; it is no longer safe to assume that text has intent, let alone content, simply because it is grammatically well-formed.

Perhaps the most darkly amusing consequence of this particular mania is that by poisoning the majority of our information environment with hallucinated slop, we have likely crippled the next several generations of machine-learning techniques before they're even invented! Small, locally-hostable LLMs will rattle along spewing spam long after the broader "genai bubble" pops, and building clean training datasets will permanently be more difficult and expensive.

The articles you publish are, in principle, a celebration of the cleverness in programming and hardware design behind video games; a vehicle for appreciating human craftsmanship and artistry.

LLMs are the product of taking the creative output of countless millions of people and turning it into a statistical model which completely erases the attribution for all that material. They can regurgitate interpolated, plagiarized copies of someone else's code, divorced from its original context, but they are structurally incapable of showing where that code came from, who wrote it, or why.

Using these tools, and using your public profile to contribute to the normalization of these tools, is profoundly disrespectful to the programmers, artists, and writers whose work was strip-mined by megacorporations to build those LLMs. You are prioritizing your personal convenience while enriching bad actors who are bent on obliterating the open web, open-source culture, and the craft of programming. It's dissonant.

Lisa and early MacOS are tremendously different in their details than the Alto operating system. While there was clearly a transfer of inspiration, Apple engineers like Bill Atkinson made countless small and large innovations to simplify the Xerox GUI model and improve its usability based on extensive in-house R&D and user testing (and in some cases implement features that the Apple team presumed Xerox had but actually didn't exist on the Alto). It is simply ahistoric to build narratives around Apple stealing Xerox ideas wholesale.

For more details on Apple's early UI evolution, Atkinson kept polaroids of a variety of prototypes and mockups: https://www.youtube.com/watch?v=Qg0mHFcB510

I think the key thing is that nothing about Decker or Lil was specifically designed or tweaked for this use case; Everything I needed to build the hershey module and make it reasonably efficient was already at my fingertips. I considered bundling up some of the patterns I describe in this article as a library, but I think it's much better to view them as transparent idioms to adapt to wherever they're needed, letting the abstraction live in your head instead of the source file.

As I wrote about two years ago in "The Benefits of Conforming", Lil's approach to handling mismatched dimensions for conforming arose from a need to plug the semantic gap left by K and Q, since Lil doesn't believe in runtime errors. While evaluating my options I made a series of pleasant idiomatic discoveries that ended up also being useful for "hershey". There is perhaps an argument that if I'd "preferred" the length of the right argument instead of the left some expressions would require fewer parentheses, but I suspect it's a wash either way.

The design of heading/mag/unit were influenced by my work with oK and iKe, particularly my annoyance at the clunkiness of writing things like {(cos x;sin x)}' or wrangling with atan2[;]. The Lil primitives help expressions "flow" together nicely, with few intermediate variables and minimal nesting. I think I spent more time agonizing over reasonably intuitive names for them than I did puzzling over semantics. I'm quite pleased with these primitives as some of Lil's hidden pearls, and I hope I can inspire other arraylangs to incorporate something similar.

Measuring education in dollars spent is rather consistent with measuring the productivity of LLMs in lines of code excreted.

The point is that https-everywhere people have successfully pushed the majority of the sites that could previously be served over vanilla http to require https anyway. Now if you're on and old device you need an https proxy or else you're out of luck.

"Accessibility" is an open-ended set of functionality, not a checkbox; it is never "complete", there is always room for improvement. Colorblind support (which ones)? High-Contrast mode? Adjustable text size? Screenreader integration? Localization? IME support? Keyboard navigation? Keyboard remapping? Functional entirely without a keyboard? Touch support? Pen support? Dyslexia-aiding typefaces? The list goes on and on.

Not especially. Depending on where you set your standards for "holding a conversation" you can satisfy the requirement with a classical markov chatterbot, a well-trained parrot, a copy of Eliza, or a telemarketer flowchart drawn on a sheet of paper. Only the markov bot is made out of "weights" in the sense of a statistical model.

Parrots are intelligent animals, albeit with a limited capacity for vocabulary and syntax compared to a human, and Eliza and the flowchart are made out of explicitly encoded rules and conversational tactics.

Indeed. Take a soft approach, or "wait and see", and you'll just allow your community to get infested with slop enthusiast crybullies that loudly protest any pushback against "genai content". The communities that draw a firm line and hold it will be the only ones that endure.

You have to make the decision somewhere in your code, unless you're willing to lean on a heuristic; all of the examples in R and Lil make assumptions about the names of columns in the file on-disk just as they make assumptions about the delimiter and the presence of headers.

If I knew the CSV file didn't have built-in headers, I'd write the Lil script like this:

    purchases:readcsv["country,amount,discount\n",read["headerless.csv"] "sii"]

Lil's readcsv[] takes three arguments: a data string, an optional typecode-string (which can also skip columns with "_"), and an optional delimiter character. First row is always assumed to be headers; I find it easy enough to concatenate on a header row before calling the function if I'm ever dealing with a headerless CSV file.

The typecode-string approach in Lil is very similar to how Q handles it with dyadic 0:.

In this specific example I could do without the typecode-string since arithmetic operators like sum, -, and * will coerce string columns into numbers, but I think this way is cleaner.

In Lil, the readcsv[] function takes an optional string specifying a type for each column to decode:

    purchases:readcsv[read["purchases.csv"] "sii"]
Summing a column:
    sum purchases.amount
To create a summary, we need to reduce each group to a single row:
    select first country sum amount by country from purchases
Discounting:
    select first country sum amount-discount by country from purchases
Lil doesn't have a "median" primitive. Decks can contain multiple modules, but we happen to know this one is alone. Your path will vary:
    stats:first import["stats.deck"]
    select first country sum amount-discount by country where amount<stats.median[amount]*10 from purchases
Calculating the median within each group is merely a matter of reordering clauses:
    select first country sum amount-discount where amount<stats.median[amount]*10 by country from purchases

The term "GenAI veganism" is deeply disingenuous, and simonw knew exactly what he was doing when he coined it.

In the broader context of most human societies treating meat consumption as a default, with thousands of years of precedent, it deliberately frames abstaining from the use of "GenAI" as an extreme perspective, suggesting that moderate or extensive usage of LLMs and their ilk is more intrinsically "normal". The "GenAI" tools in question have only existed for a few years- or perhaps months in more specific cases- and the unending marketing blitz around them notwithstanding, using them does not remotely represent an engrained cultural default.

The choice of terminology also casually devalues and denigrates the reasons many people have for being actual vegans. It's meant to sneeringly evoke negative stereotypes of vegans as annoying and irrational.

Attempting to carve out a "softened" version of this language with the "vegetarian" label is not descriptively useful.

Amending a slice would amend only the slice:

    l_inner:l[1][1]
    # {"age":3}
    l_inner.age:9
    # {"age":9}
    l_inner
    # {"age":9}
    l
    # (1,(2,{"age":3}),4)
If an amending expression isn't "rooted" in a variable binding, it also returns the entire new structure:
    (1,(list 2,list ().age:5),4)[1][1].age:99
    # (1,(2,{"age":99}),4)

In Lil[0], this is how ordinary assignment syntax works. Implicitly defining a dictionary stored in a variable named "cat" with a field "age":

    cat.age:3
    # {"age":3}
Defining "l" as in the example in the article. We need the "list" operator to enlist nested values so that the "," operator doesn't concatenate them into a flat list:
    l:1,(list 2,list cat),4
    # (1,(2,{"age":3}),4)
Updating the "age" field in the nested dictionary. Lil's basic datatypes are immutable, so "l" is rebound to a new list containing a new dictionary, leaving any previous references undisturbed:
    l[1][1].age:9
    # (1,(2,{"age":9}),4)
    cat
    # {"age":3}
There's no special "infix" promotion syntax, so that last example would be:
    l:l,5
    # (1,(2,{"age":9}),4,5)
[0] http://beyondloom.com/tools/trylil.html

It's classic ladder-kicking behavior, reveling in the mild conveniences of "genai" while comfortably impervious to the externalities. Shameful that the moderators of so many online communities turn a blind eye to- or even offer explicit support for- their endless shilling for hideously unethical web-destroying for-profit companies simply because they express their native advertising in a superficially polite register.

I think everyone who believes that they can personally resist the detrimental psychological effects of exposure to LLMs by "remaining aware" or "being careful", because they have cultivated an understanding of how language models work, is falling into precisely the same fallacy as people who think they can't be conned or that marketing doesn't work on them.

Don't kid yourself. If you use this junk, it's making you dumber and damaging your critical thinking skills, full-stop. This is delegation of core competency. You may feel smarter, or that you're learning faster, of that you're more productive, but to people who aren't addicted to LLMs it sounds exactly like gamblers insisting they have a foolproof system for slots, or alcoholics insisting that a few beers make them a better driver. Nobody outside the bubble is impressed with the results.

LLM enthusiasts will always point to whatever scraps of personal value they've extracted from their use of genai as a rationale for their indispensability. Arguing from personal utility rings hollow for anyone who takes the externalities of these "tools" seriously: their erasure of the authorship of their training corpus, their erosion of social contracts, their putrefaction of the commons with endless waves of slop, etc. I'm glad FreeBSD has managed to hold the line against this sort of shortsighted ends-justify-means thinking, and I hope they don't soften their stance against slop in the future.