I haven't used Squeak since college but I'm glad it was part of the cirriculum.
Btw, almost all of Javascript's good parts come from Smalltalk.
The indirect function calls of Smalltalk don't transform the semantics of programming. It's still data structures and algorithms. You can, if you adopt Kay's ideas wholesale, write programs where individual letters in a text typeset themselves (as Kay describes). I'm arguing that that model of programming is more accurately articulated in an async message passing frame.
Smalltalk's function calls do have an important benefit, which is polysemy. I'm stealing that word and not using it quite right. The benefit is you can define ideas that are not algorithmic. You can for instance define many methods for LOOKUP(key,table) that works for many data structures, and now you've defined not a recipe, but an idea that transcends recipes. Any recipe R that uses LOOKUP automatically works with all the data structures that LOOKUP works with, even though R itself may be a specific recipe for a specific data structure of its own.
That's a tremendous benefit, and it's worth using OO features to take advantage. But even so you're still living in an algorithms and data structures world. Polysemy is a linguistic feature and does not cause a mechanical or paradigmatic change.
Asynchronous messaging however does change how algorithms are designed, in much the way that Alan Kay anticipated, and also in a way that models real world entities in direct fashion. But everyone understands this part already.
So how is this a "better" way of thinking about objects? 1) It emphasizes the advantage of polysemy, which in my experience OO pedagogy tends to overlook, even though most everyone utilizes OO partly for that purpose; 2) It explains why OO programs remain organized as algorithms and data structures; and 3) it welcomes combining "object" techniques with A & DS techniques in the same program or function or even the same line of code. They are completely compatible, in the sense that the language or library or database is not "OO" or "non-OO".
Question? Does this work with Etoys? If so, how? I tried following various directions online without success. Thanks!
That's E and Self erasure.
Is this underselling the role of Self in JS’s prototype-based object system, or saying that a prototype-based object system is not one of the good parts?
All languages that multiply your insight into the nature of computer programming. A bit sad that many just stop at the first of these, and many more don’t even venture past their Pythons and Javascripts.
Seriously, reading Unicode enhanced code in a 45 degree tilted editor window, while zooming in and out just for kicks (all of this can be done by manipulating the morph with its halo's menu) just to see how crisp everything is - thats FUN!
Also, try taking apart the standard system browser (4 panes + editor), rearrange everything as per your tastes (by drag & drop), and ... everything still works
Then again, not having to disable this for runtime is a feature if you ask me.
Yes, current web applications are prettier and easier to upgrade but we lost a lot on the way wrt developer experience and ux.
The problem is that as beautiful as programing in that sound, we're not even coding anymore, AIs will take the fun of it.
Although, thinking long term and for understendabilitymaxxin and reliabilitymaxxin it might still be worth having something like that.
Since Smalltalk can be so close to english and Erlang VM so reliable, humans and LLMs should thrive on it.
My favourite thing about it is the lack of "reserved words" - just a handful of punctuation marks. It's incredibly pure - almost all of the syntax is "send this message to this object".
I am unaware how it evolved since then, especially given the differences between Self and Smalltalk.
(Crudely) mmap the ST image to a 100GB file and just change pages. Let the OS flush the pages back and forth.
Maybe full boat, heap sweeping GCs would be Bad as it pages the entirety of the heap in and out. But we have (had) lots of RAM these days. We have generational GCs that leave idle stuff alone. Its no doubt impractical, but I think it would be neat to have the entirety of my historical email in the global "mailbox" array, and I can build indexes off it as I wished. But the mail isn't "on disk", it's all marshalled up as first class objects.
I don't know enough about it, no doubt it "won't work", but the idea of simply mapping the entire, large, ST VM heap to a persistent backing store, just be interesting I would think.
Dangerous too, as there is a demarcation between "running image" and "saved image". But, still think it could be interesting.
> Any recipe R that uses LOOKUP automatically works with all the data structures that LOOKUP works with, even though R itself may be a specific recipe for a specific data structure of its own.
this seems similar to protocol extensions + associated types as used in swift maybe?https://docs.swift.org/swift-book/documentation/the-swift-pr...
It's a shame. Smalltalk/Squeak/Pharo was supposed to be the future, but it feels like an IDE stuck in the 90's.
or my language https://github.com/timbran-project/mica
Nubank (the largest digital bank in the world) using Clojure as their primary driver grew from ~12M customers in 2019 to 131M in 2025 - almost 1000% growth in less than a decade. JPMorgan that has about 80M customers took around 150 years and dozens of acquisitions.
Apple, Walmart, Netflix, Cisco, Amazon - they all use Clojure. Google and Grammarly use Common Lisp.
Check the GitHub language stats and be surprised to see Emacs Lisp among the visible top. There's so much Elisp on GitHub alone - it's just effing crazy. That fact alone at least should be surprising. Remember? This is a not a general-purpose language - it's made for one and only thing, tis a damn configuration language for a text editor. And no, it isn't "some old stuff", check r/emacs - new packages get announced daily! I'm not even exaggerating - new stuff for Emacs comes every single day. Who the heck are all these psychos? Have they not realized how "forgotten" and "dead" Lisp was?
Seriously though, Lisp dialects are enormously practical, it is inconceivable today to find a runtime where you just can't run stuff built with a Lisp. And Lispers keep adding more - Janet, Jank, Jolt, Fennel, Clojure-Dart, Cljbang, Squint - all are pretty young, yet already not some "useless toys" - they're used to build real stuff.
Yes, some people would dive deep into the craft and create works of art, exquisite furniture and tools they need to make it even better.
But those are the few. For the most of woodworkers this is just something they somehow learned to do on a level needed to be able to get a job and make living.
Or... Writing a compiler from a large language test suite is already an LLM sweet spot. Writing code which is atypically pretty and readable isn't... but there's at least a possibility of that changing someday.
Imagine a future Lisp-ish culture of "write code to communicate with humans - prioritize readability - machine execution is incidental" and "don't merely solve a problem - write a language for the problem space (and keep it cleanly updated)"... but moving at LLM-catalyzed speed. So much fun.
Nowadays I write a lot of TypeScript and prefer having a type system (especially for agentic coding), but Ruby is one of my favorite languages to write myself :)
I suspect that over time a good grasp of fundamentals and great tooling will only get more valuable in software as well as automation expands, in whichever form.
Automation expands the demand for skills. It can never diminish it. Required variety indicates that complexity doesn't go away with automation, and at some level someone will have to understand and make decisions about complex issues. You can't automate all the way down. Or, put another way, everything is already automated all the way down. The expansion of automation as we perceive it is merely the growth of complexity over new dimensions.
Or put a third way: automation means two different things: constraint and liberty. The confusion arising from not discerning which one is in force makes it seems like one can grow unbounded. Liberty requires constraint and vice versa.
It ain't a version of Squeak, though.
I think smalltalk and erlang are so interesting because they model the idea of small computers so differently.
Lisp just feels like the purest way to understand what the units of a programming language really is.
We've come to this. The mere existence of AI is discouraging people from pursuing creative ideas. This is a catastrophe! It's not just taking the fun out of life, it's destroying alternative futures we might have built.
There is this advice for dealing with tyrants and would-be tyrants: "Do not obey in advance." In your case that means pursuing and implementing your exciting ideas.
... it might still be worth having something like that.
Yes! Good luck with it!
Is it because of its length giving false signals ?
https://news.ycombinator.com/item?id=8841428
Self Morphic is not a classical class hierarchy. The handbook describes parallel traits objects (shared behavior) and prototypes (structure), with instances delegating via parent* slots and "copy-down" differential prototypes. Bottom-up: morph copy, tweak, factor shared behavior into a traits object. Worth reading section 7.3 alongside pjmlp's links.
https://handbook.selflanguage.org/2017.1/morphic.html
The Squeak port is single-inheritance Smalltalk classes -- closer to what most people mean by "OOP UI toolkit." Etoys is Morphic. Full Squeak Morphic in a browser, no install:
Squeak 6.1 release notes (Objectland, tree morph overhaul):
https://squeak.org/release_notes/6.1/
In JavaScript there are two Morphic implementations people often conflate. Same family, not the same code.
Dan Ingalls's Lively Kernel / Lively Web (~2008, Sun) is the full live system: modular core/lively/morphic/ (Halos, Serialization, Scrubbing, Connectors, constraints), plus IDE, parts bin, world persistence. JSConf 2012 demo:
https://github.com/LivelyKernel/LivelyKernel
https://github.com/LivelyKernel/LivelyKernel/tree/master/cor...
Jens Monig's morphic.js (~2010, BYOB4/Snap!) is a separate codebase: single-file Canvas kernel (~13k lines), World/Hand/stepping/dirty rects, template peel-off, ScrollFrame inertial pan. Jens names Ingalls's LK as the gold standard but says it is not a direct port -- though fullCopy() was ported almost literally from Squeak, comments included. Snap bundled it from day one (2013-03-16). Standalone extract:
https://github.com/jmoenig/Snap/blob/master/src/morphic.js
https://github.com/jmoenig/Snap/blob/master/docs/morphic.txt
https://github.com/jmoenig/morphic.js
https://wiki.squeak.org/squeak/6550
https://en.wikipedia.org/wiki/Morphic_(software)
On multiple inheritance: neither JS port uses it, and Self Morphic didn't really either. LK cheats with an explicit Trait composition layer (Object.subclass plus Trait(...) mixins). Snap cheats with Squeak-style copying (fullCopy, isTemplate peel-off). The live feel comes from copyable morph trees and shared behavior, not MI.
If you want one more readable architecture tour beyond sin-ack's intro, the Self handbook chapter 7 is still the root document; everything else is commentary on it.
The core pattern was that the Proxy, which was under Nil and above all other Objects regarding inheritance I think.
It re-implemented `doesNotUnterstand:` by: 1) First loading the actual object from the persistent storage and 2) sending the not understood message to the actual loaded object (which might be able to answer the message instead of calling `doesNotUnderstand:` for every message, like Proxy did.
There where if course optimisations and so on, but that was the gist of it.
What I really like about this system was that it was completely transparent to the sender of the message whether they were talking to a proxy, or the already-loaded object, all while being robust, easy to maintain and so ob. Dealing with collections was tricky though (how much to load at once? what about searching for a particular object?...), and would have been aswell for deeply nested object (which they successfully avoided though because as a SaaS-company, they could model the data exactly to their needs).
NixOS by contrast takes the entire Linux userland and makes it an immutable, dead compiler artifact. So it is to debian like C or Rust are to Lisp.
> Improves high-DPI support for buttons, scroll panes, sliders, menus, multi-selection lists, trees, drop-shadows, the scratch pad, the keyboard exerciser, and others.
https://squeak.org/release_notes/6.1/#:~:text=and%20dialog%2...
I have written a fair amount of Elixir (and targeting business applications) and I think Elixir's expressiveness lends itself well to making more abstract models of the business processes and data seen in solving business problems. However, writing Elixir I find you end up reading a lot of Erlang and in certain problem spaces I could imagine the appeal over Elixir. I could absolutely see where if I were writing more technically oriented programs.... programs closer to the hardware in some ways or programs designed to communicate with other programs (protocols, etc.) I could see Erlang as being a more clear and direct language in these circumstances.
All of this is very hand-wavy, but it's my impression.
experts will emerge from this convenience focused paradigm we are entering so the output quality will certainly improve imo.
You don't persist the state of the full image continuously to the host disk, but any given state (new programs, new runtime state, filesystem) can be saved via a delta, not a full rewrite, due to this representation.
So this is a little different than what you are talking about, but I'd say it's possible.
I think also IBM has or had somewhat similar concepts.
(Agreed that TCL is pretty cool)
Other than that, vanilla Erlang is THE way to go.
Last time I touched Erlang, "Learn you some Erlang for great good!" was fresh out of the printers.
I count many more native GUI support in all Smalltalk versions https://github.com/jeceljr/SmalltalkSurvey
Squeak goes back all the way to 1972, we ran on most GUIs in existence. Smalltalk was the invention of the first GUI. https://smalltalkzoo.computerhistory.org
See many of my old comments on my 18 years on HN https://news.ycombinator.com/threads?id=morphle
I even have the most scalable (massively parallel) GUI written in a few thosand lines of code: https://youtu.be/f1605Zmwek8?t=3100
And several 3D GUIs https://www.youtube.com/watch?v=1s9ldlqhVkM&t=4s and the highly scalable https://www.youtube.com/watch?v=uQTeWJNkylI
https://news.ycombinator.com/item?id=8841428
Self Morphic is not a classical class hierarchy. The handbook describes parallel traits objects (shared behavior) and prototypes (structure), with instances delegating via parent* slots and "copy-down" differential prototypes. Bottom-up: morph copy, tweak, factor shared behavior into a traits object. Worth reading section 7.3 alongside pjmlp's links.
https://handbook.selflanguage.org/2017.1/morphic.html
The Squeak port is single-inheritance Smalltalk classes -- closer to what most people mean by "OOP UI toolkit." Etoys is Morphic. Full Squeak Morphic in a browser, no install:
Squeak 6.1 release notes (Objectland, tree morph overhaul):
https://squeak.org/release_notes/6.1/
In JavaScript there are two Morphic implementations people often conflate. Same family, not the same code.
Dan Ingalls's Lively Kernel / Lively Web (~2008, Sun) is the full live system: modular core/lively/morphic/ (Halos, Serialization, Scrubbing, Connectors, constraints), plus IDE, parts bin, world persistence. JSConf 2012 demo:
https://github.com/LivelyKernel/LivelyKernel
https://github.com/LivelyKernel/LivelyKernel/tree/master/cor...
Jens Monig's morphic.js (~2010, BYOB4/Snap!) is a separate codebase: single-file Canvas kernel (~13k lines), World/Hand/stepping/dirty rects, template peel-off, ScrollFrame inertial pan. Jens names Ingalls's LK as the gold standard but says it is not a direct port -- though fullCopy() was ported almost literally from Squeak, comments included. Snap bundled it from day one (2013-03-16). Standalone extract:
https://github.com/jmoenig/Snap/blob/master/src/morphic.js
https://github.com/jmoenig/Snap/blob/master/docs/morphic.txt
https://github.com/jmoenig/morphic.js
https://wiki.squeak.org/squeak/6550
https://en.wikipedia.org/wiki/Morphic_(software)
On multiple inheritance: neither JS port uses it, and Self Morphic didn't really either. LK cheats with an explicit Trait composition layer (Object.subclass plus Trait(...) mixins). Snap cheats with Squeak-style copying (fullCopy, isTemplate peel-off). The live feel comes from copyable morph trees and shared behavior, not MI.
If you want one more readable architecture tour beyond sin-ack's intro, the Self handbook chapter 7 is still the root document; everything else is commentary on it.
When you launch the Emacs editor, you're loading an Emacs Lisp image that was populated at build time by running Lisp code, with the resident Lisp definitions "dumped" to make an image file.
The image file used to actually be the `emacs` executable you'd run, using a clever but non-portable mechanism called `unexec` to make an executable.
But as of version 27.1 (in 2020), the image file is separate from the executable for portability reasons.
Millennials catching strays I see.
https://en.wikipedia.org/wiki/InterSystems_Cach%C3%A9
Which I heard about from a friend who was using it at work.
https://en.wikipedia.org/wiki/Comparison_of_object_database_...
Caché is first one in the table.
I remember object or object relational databases were popular at one time. maybe they still are to some extent.
Once you start doing that, you move a ladder up in problem solving, where you solve class of problems instead of specific instances.
I've just not had time to learn further. As swapping between languages when trying to complete my original Tcl project is tricky. I'm now poking around with Crystal.
A rookie example of erlang and converting strings to base16. I posted in haste a while ago on Tcl's IRC but fun. Never did implement the teddy bear colour.
"claude, run 'npm install' for me"
I find this to be a very strange thing to get defensive about. It's not exactly a subtle part of Elixir's history. It was pretty well documented to be born out of the creator's dissatisfaction with concurrency in Ruby, and simultaneously, for a more Ruby-like language on the BEAM. That doesn't mean it's literally Ruby-on-the-BEAM (which was originally attempted, and didn't work out), however mistaking that as cause to dismiss the link between the two and the carry-over appeal for developers is an unsound overcorrection.
Love your long comments.
> Oh I've posted much longer than that (see the one I linked) without getting flagged
Those were simpler times
Oh shit, I just missed a Bakelite discussion 17 days ago!
https://news.ycombinator.com/item?id=49026992
But there's a comment from 9 days ago that's still replyable. ;)
These release notes are optimized for viewing inside Squeak, as they contain a lot of interactive examples. On this page, interactive links open in SqueakJS, which is a browser-based Smalltalk VM with some limitations. For the best experience, download Squeak and read the release notes there.
*** Squeak 6.1 "Vanessa" Release Notes ***
As Squeak approaches its 30th anniversary, we are proud to announce the next version of the system, Squeak 6.1. Some highlights of this release are:
Please find below a detailed listing of all the changes, which includes notes on Major Deprecations, Known Issues, and Compatibility Notes at the bottom.
About these release notes. Phew, what a release! Since the last release 4 years ago, we have merged 1700+ patches with 9000+ method changes. Beyond documenting technical changes in detail, these notes highlight the bigger picture and the overall impact of major developments. Along the way, you will find plenty of links to code pointers and interactive examples. Thus, these release notes serve not only as a changelog but also as a hands-on guide to exploring new features and mechanisms in Squeak. Click here to view an outline of this document.
In memory of Vanessa Freudenberg (1972-2025).
/^(o.o)^\ /^(o.o)^\ /^(o.o)^\ /^(o.o)^\ /^(o.o)^\
Detailed Improvements in Language, Tools, and the Environment
~~~ GUI Frameworks ~~~
Morphic (up to Morphic-ct.2218/MorphicTests-ct.97_)_
MorphicExtras (up to MorphicExtras-ct.360_)_
Etoys (up to EToys-ct.532_)_
ST80 (up to ST80-mt.311_)_
CommandLine (up to CommandLine-eem.27_)_
~~~ Programming & Tools ~~~
Tools (up to Tools-mt.1366/ToolsTests-ct.137_)_
csz and stz archives.ToolBuilder (up to ToolBuilder-Kernel-ct.176_/ToolBuilder-Morphic-ct.370/ToolBuilder-MVC-mt.77/ToolBuilder-Tests-ct.9)_
SUnit (up to SUnit-mt.153/SUnitGUI-mt.95/SUnitTools-mt.9/ToolBuilder-SUnit-pre.22_)_
Nebraska (up to Nebraska-ct.65_)_
Protocols (up to Protocols-ct.91_)_
Services
Shout (Syntax Highlighting) (up to ShoutCore-ct.98/ShoutTests-eem.34_)_
~~~ Core Language ~~~
Kernel (up to Kernel-ct.1688/KernelTests-ct.482_)_
Collections (up to Collections-ct.1115/CollectionsTests-ct.419_)_
.
,
.