Ad 1.
To cut a long story short,
the ANSI Smalltalk standard is the nearest thing we have to a clear specification
of the nearest thing we have to a consensus.
One of the reasons that Smalltalk gets less use than many of us would like
is that it can be extremely unpleasant trying to port from one dialect of
Smalltalk to another, so you have to commit to a dialect.
And dialects of Smalltalk have an unpleasant habit of disappearing.
I really liked Ambrai. What was I to do with my Ambrai code when
Ambrai disappeared?
I have never met a better-looking Smalltalk than Dolphin.
ObjectArts stopped selling Dolphin a year or two ago, and open sourced it.
Today the ObjectArts website has an expired certificate,
pages have the date 2016 on them,
and the GitHub link points to a GitHub site containing an Amber fork
but no Dolphin.
Imagine my relief at discovering that Dolphin *is* still being maintained,
it's just not where ObjectArts said it was. But I am worried about
whether I should bother with it any more.
Then there's ST/X.
...
Code written for C99 is still useful.
I have four different C compilers and I don't have to care which one I use.
Code written for Fortran95 is still useful (and yes I know about Fortran 2018).
I have two different Fortran compilers; the one that does the best job handles
Fortran 2003 but not 2008 or 2018, and as long as I stick to 2003 I don't have
to care which I use.
The Common Lisp standard came out in 1994 and the HyperSpec is still useful
to me for writing Lisp today.
My copy of Common Lisp the Language, 2nd edition, is still useful to me.
Ad 2.
In the Pharo 7.0 sources there are on the order of 600 senders of #signal[:]
-- exceptions and semaphores both use #signal so this is approximate --
and on the order of 1000 senders of #error:, which really should be
exceptions. (It is surprisingly hard to make this change.) The newer
components use exceptions a lot more than the old ones.
Of course some exceptions (like subscript out of bounds) are raised
inside primitives, which Ctrl-N doesn't show you.
One quite strange thing about the ANSI Smalltalk standard is that it
introduced an elaborate exception-handling system into the language
-- much more complicated than C++ or Java or Ada -- but introduced
almost no standard exceptions that a portable program could catch.
Let's take one consequence of this.
What does
(OrderedCollection withAll: #[3 1 4 1 5 9]) copyFrom: 2.5 to: 4.2
do?
My Smalltalk: currently reports 'bad start' coming from the call to
#copyFrom:to: with culprit 2.5.
This is going to be an IndexError some day; cleaning
up the code to use well-chosen exceptions is a mammoth task.
Squeak: 'Array called #basicNew: with invalid argument 2.7'
Of course there is no 2.7 in our code...
Pharo: 'PrimitiveFailed: primitive #basicNew: in Array class failed'
VW: 'Unhandled exception: This message needs a positive integer argument'
appearing to come from OrderedCollection>>new:
VisualAge Smalltalk: drops you into a debugger with no actual explanation;
the only number in sight is 2.7, which is not one of the numbers we provided.
GNU Smalltalk: 'Object: 1 error: The program attempted to divide a number by zero'.
I kid you not.
Exceptions could be useful IF you knew what to catch.
Just for grins, sending #copyFrom:to: to an OrderedCollection with a start
or stop value out of range raises an ExCLDTIndexOutOfRange exception but
sending it to an Array with the same contents does not.
Ad 3.
allButFirst: n ^self copyFrom: n+1 to: self size
and then ask what #copyFrom:to: should do.
This is actually one tiny symptom of a pervasive issue in Smalltalk.