Another excessive flexible feature of Smalltalk is that even many aspects of the language and of the programming environment may be changed using the language and the environment itself, while you are using it. It may be very funny and very stimulating for those who are investigating on a better language or a better programming environment, but it is useless and dangerous for application programmers. Examples of such flexibility are:
* Metaclasses, that is every class is an object, whose class is the metaclass of that class. Of course also the metaclasses are objects, and they are all instances of the Metaclass class.
* Methods are objects. They are instances of the class Method.
* Nil is an object (it corresponds to “null” in other languages). It is the only instance of the class UndefinedObject.
* The programming environment may be modified while it runs. You may execute a command that changes the windowing system or the programming environment built on it in a way that it becomes no more usable, and then it is somewhat hard to get back a usable system, because of course you cannot use the standard programming environment to fix itself.
All in all, I think that Smalltalk was and still is a wonderful research environment, useful to explore new programming paradigms, and artificial intelligence algorithms, but it not a good production environments. Actually, it is very little used outside academia, in spite there are several implementations of it.
The best ideas of Smalltalk have been taken by the Ruby language. Another language heavily influenced by Smalltalk is Objective-C, that is a C-Smalltalk hybrid. It uses C language for control structures, numeric types, structs and arrays, while it uses Smalltalk as an object-oriented extension.