Elixirについて語る時に「Ruby風な」といった言葉が使われるのをそこかしこで見てきました。
「Ruby風な」という謳い文句は、Rubyの熱狂的なファンたちの注意を引きます。それ自体が悪いことだとは思いませんが、Rubyist達が「ElixirはRubyではなかった」と落胆している様子は見るに堪えません。
Eixirを形容する言葉としてそれが適しているかについて、考える余地がありそうです。
一見するとRubyとElixirのコードは似ています。
def greet(name)
"Hello, #{name}"
end
def greet(name) do
"Hello, #{name}"
end
とは言え、いくら関数定義の字面が似ていても、そもそもRubyとElixirはプログラミング言語のパラダイムが異なります。
両者の違いは書けば書くほど身に染みるのですが、以下の例を見ればその違いが一目瞭然です。
["john", "tom"].map {|name| name.uppercase }
Enum.map(["john", "tom"], fn(name) -> String.uppercase(name) end)
Rubyはオブジェクトのクラスを見て、Array#mapというインスタンスメソッドを呼び出しています。
言うまでもなくこのカラクリはElixirにはありません。metaprogrammingでもしない限り、「Ruby風に」記述することはできません。
(逆に言えば、metaprogrammingさえすればRubyっぽく書けると思う)
僕は「ElixirにとってRubyは取るに足らないものだ」と言いたいのではありません。
作者であるJose valimはRailsやrackのコミッターですし、 ElixirがRubyから受けた影響が少なくないのは明白です。
ElixirがErlangの単なる方言ではないことを証明するのに必要なものの多くも、Rubyのエコシステムに由来するものだと見て取れます。
ただ、もしこれからElixirを始める人がいるのなら、「Ruby風な」という言葉について今一度考えてみて欲しいのです。
Erlangと、Rubyを含むこれまでのあらゆる巨人の肩の上に立っているのがElixirなのであって、「単なるRuby風な関数型言語」でもなければ「単なるErlangの方言」でもありません。