- Avoid shared state
- Avoid mutating state
- Avoid side effects
No language enforcement for these. It’s really done by convention and discipline, which you can also do in other languages like Java and Smalltalk.
In fact, the defining quality of any and all FP languages is the presence of first-class functions and closures. Everything else is notation. Even immutability is not a strict requirement in many FP languages. So it would not be unreasonable to call Smalltalk a FP language! (Did you know that Smalltalk has methods for map and reduce?)