7,317 karma · joined February 13, 2010
Abstaining from buying from companies you disagree with can help, but it is only one part of the broader solution. When there aren't alternatives yet "on the market" you may be forced to hold your nose for a while and buy from the vendors you hate while advocating for change and working toward their replacement. You don't have to solve every problem in your world at once so long as you're building in the right direction.
The colon (read aloud as "becomes" or "gets") is Lil's assignment operator. That single line,
myname.text:alert["What is your name?" "string"]
prompts for input and then stores the result in a card field. If you wish, you could also write it as: on click do
name:alert["What is your name?" "string"]
myname.text:name
end
Learning the syntax for calling functions is partially scaffolded by the "Action..." dialog that button widgets offer for constructing simple button scripts with a GUI: on click do
go["Next" "BoxIn"]
play["sosumi"]
end
Users can rely on the system to write code for them initially, and then slowly dip their toes into more complex compositions. Whereas HyperTalk has custom syntax for almost every programming construct and built-in function or feature, the Lil grammar is simple and uniform. Where symbols appear, they have a single meaning. Decker's "Listener" REPL allows the user to have a back-and-forth "conversation" with the Lil interpreter and see responses juxtaposed with their questions, versus the HyperCard "message box" which shows only user input or a single system response.Ultimately, every programming language does require some degree of handholding and learning, and that's why Decker comes with dozens of example decks to take apart and study. The user community has also furnished some truly fantastic interactive tutorials:
on click do
end
And filling it in with an equivalent script would be something like: on click do
myname.text:alert["What is your name?" "string"]
end
There is slightly more "programming-language-like" punctuation to Lil than HyperTalk, but simple examples are still simple, and in my opinion having first-class collections (lists, dictionaries, tables) and a richer set of APL-like operators makes Lil scale up much better to more complex programs. As a child I recall struggling tremendously with HyperTalk's "almost-english" structure; it made scripts easy enough to read and understand, but provided very little help when it came to writing new scripts.Decker has a similar Widget -> Card -> Deck event bubbling hierarchy to HyperCard, and in my opinion retains much of the same directness and simplicity for simple applications. The differences in approach won't please everyone, but they are all carefully considered, and have been refined over time based on feedback from the user community. Decker is a living, growing platform!
You can create "contraptions" as specialized data containers/editors for specific applications:
http://beyondloom.com/decker/decker.html#customwidgets
For example, "WigglyKit" offers several contraptions which operate on a shared convention for representing animated images:
http://beyondloom.com/decker/wigglykit.html
You can also represent composite data as a series of cards in a deck, or use cards as encapsulated "objects" that you communicate with via events:
http://beyondloom.com/blog/sketchpad.html#cardsarerecords
In a pinch, you can also easily encode arbitrary data in fields as a JSON superset with their ".data" attribute.
There are over 300 games, zines, visual novels, and toys built with Decker on itch.io: https://itch.io/games/tag-decker
Last month saw the first game made entirely in Decker published on Steam: https://store.steampowered.com/app/4693460/The_Dreams_in_the...
We are neither living in the past nor wasting our time.
https://beyondloom.com/decker/fonts.html
We also recently gained a library for working with vector-based text:
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.
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.
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
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.
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.