@
Zach 🇮🇱 🇺🇸 I think you're basically correct to point out that Emacs does not adhere to the unix philosophy as it is classically understood.
The locus classicus is presumably the widely quoted McIlroy et. al. in the 'Unix Time-Sharing System" where Emacs clearly violates the first maxim:
Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new "features."
Or to take a later articulation, Gancarz in
Linux and the Unix Philosophy's first two tenets: 'Small is Beautiful', 'Each Program Does One Thing Well' — again Emacs is the opposite of this.
(This kind of thing comes up constantly in every mention of the Unix philosophy that I've ever seen until this conversation and is easily verified by simply searching. It's strange to see people insisting that there is simply no emphasis on small, special purpose programs. Of course one can decide that principle isn't important, but let's not ignore that it was (and I believe usually still is) considered to be so)
We can also note that in the original incarnation of Unix ('Research Unix') there was nothing remotely like emacs and there was, as far as I know, very little scriptability. The Thompson shell allowed for piping but not scripting. OG unix is everything is written in C, with a simple interactive shell and if you want anything else it's back to C programming.
Whereas Emacs does (as you say) have more in common with the Lisp ethos, where there aren't separate programs per se and everything is a function in one giant Lisp environment (same is true of Smalltalk) — although there are differences there, too which I might get on to later.
I think it pays to note that these views are informed by very different language traditions. C is a static language with an explicit and slow compilation step. Lisp on the other hand has always been a dynamic language where you can just throw a new function into your environment pretty much immediately, usually without having to (explicitly) compile or restart anything.
If you think about it a bit you might start to see that if all you've got is C, small programs that don't keep their own state but write to text files may be the simplest option for getting any composibility, particularly on limited machines.
However, I think we can fairly say that Unix found that only having a statically compiled language available was far too limiting and early on started haltingly down a path to acquiring dynamic programming abilities, starting with scriptable shells, and later larger programs with their own scripting languages.
People often cite the Unix philosophy as though it's obviously the right way to program. Modularity, clear interfaces, and composibilty we all think are good things, of course. But why is 'one program does one thing' better - or even equal to - 'one function does one thing'?
#
emacs #
lisp #
unix