I find that my ruby code more and more resembles functional programming:<p>Instance variables are always set in the constructor, and almost never mutated.<p>The thing I like about OOP is really just that the methods of an object don't have to take a bunch of parameters, but that it instead can rely on the instance variables. I guess in functional programming, this would be something like having a (constructor) function that returns a hash of methods that have been given what in OOP would be instance variables as their first parameters, and then only need non-instance variables through currying. My question is, is there a functional programming language that not only supports, but `encourages` this OOP style programming?
Back in the day (finishing up my PhD thesis in 1998) I would write C code with functions like<p><pre><code> some_method(Object* this, ...)
</code></pre>
that was effectively "object based" even if there was no support for inheritance. Ultimately this style reifies data structures as objects and provides a systematic approach to many problems such as how you allocate memory. The one area where I feel it falls short is that there ought to be some way of switching from struct-of-arrays to arrays-of-struct representations.<p>This is not too different from how many real object-oriented systems are implemented.<p>There is a quite a bit of overlap between "using functional programming techniques to implement an object-oriented style" and "using object-oriented techniques to implement a functional programming style."<p>There's nothing more annoying in the lower teachings of programming that circulate than the "FUNCT10NS RULE, 0BJECTS DR001" sentiment you see so much of.
JS doesn't have true classes, but I use the class keyword often to do what you're describing: creating immutable OOP style models that i can pass around as function arguments.
F#. It's functional first. Supports currying, HoF, maybe types, composition, pipelining and most of the functional goodies.
It offers a neat indented syntax for OOPs.<p>You can also do function calls with optional arguments with defaults.