If Ruby is object-oriented Perl, then Reia is object-oriented Erlang
unlimitednovelty.com
unlimitednovelty.com
From his example:
= Reia:
class Foo
def initialize(value)
@value = value
end
def value
@value
end
end
= Erlang: -module(foo, [Value]).
value() -> Value.
And it's actually prettier.Can you do some crazy pattern matching and type overloading like with Scala? Or is it just syntactic sugar for parametrized modules?
1. the initialize function allows you to encapsulate modifications to data when it is received. A parametrized module only takes a variable, so any modification done to the parameters needs to be done outside the module (Mod:new(F(Arg))).
2. Semantically speaking, parametrized modules are NOT classes/objects. They're meant as a syntactic shortcut to carry state and a module name as a single variable when calling it and writing the module itself. What I mean is that Mod:Fun(Arg) now becomes Mod:Fun(), and Arg is hidden within Mod (The current implementation is {ModuleName, Arg}:Fun()).
This use is rarely necessary and often seen as bad form by many Erlang regulars (myself included), mostly because it introduce new [superfluous] ways to do existing things in a language where its small core is appreciated. Also functional programmers getting mad at OO programmers trying to get their way in a language that was not meant for that.
Also, Reia has inheritance. Parameterized modules don't.
Object orientation in Reia is baked into the core language itself. Like Ruby, all of its core types are objects. In Perl and Erlang they are not. Reia factors the core language types into objects, instead of amalgamations of the core types with arbitrary and poorly factored functions which act on them.
So... what is the complaint about records really?
You instead need to expand the old version of the record to avoid the problem. If you forget to, things will go wrong.
So yeah, they're ugly and get tricky in some areas of your programs, but they're still essential when you want a data structure with named fields AND pattern matching. You get used to them, but they're still considered a wart to many programmers.
Bar = Foo#foorecord.bar, Baz = Foo#foorecord.baz
it feels unnecessarily redundant. Shouldn't we already know Foo is a record of 'fake type' #foorecord? It's like a poor man's type system, and it's ugly.
Also, probably more importantly, since they're a compile-time trick you can't use them in the console, which makes experimentation and sometimes debugging harder.
#foorecord{bar=Bar, baz=Baz} = Foo
Readability depends on what does your brain process, when you see "=" ;)
> since they're a compile-time trick you can't use them in the console
Check the `rX` commands from http://www.erlang.org/doc/man/shell.html You can use the records just like in normal code, but you have to load them explicitly.