ElixirLangの紹介

公開: 2015-02-27

Elixirプログラミング言語の紹介(そしてなぜ私はそれを愛するのか)

数か月前にGolangを紹介する記事を書きましたが、なぜそれがとても好きだったのですか。 私は確かにそれをまだ愛していますが、最近私は新しい言語で遊んでいます。 エリクサー。 私は本ProgrammingElixirを購入し、それをフォローしてきました。 私はすでにエリクサーを愛するようになりました。この記事でその理由をお見せしたいと思います。

数年前にCouchbaseで働いていたとき、Erlangと分散システムに大きな関心を持っていました。 私にとって、Erlangは混乱しています。 エリクサーを見たとき、私はすぐに自分が何か良いことに夢中になっていることに気づきました。 Elixirは、ErlangVM上で実行される機能的で並行した言語として詳しく説明されています。

Elixirは「RubyforErlang」などとよく耳にします。この理論は完全に間違っているわけではありませんが、現実的には、Rubyの影響を受けるのは主にElixirの構文であり、共有されません。同じプログラミング構造の多く。 もちろん、Erlangと似ていますが、Erlang VMの上に構築されており、Erlangプリミティブにネイティブに直接アクセスできます。

とにかく、それ以上躊躇することなく、飛び込んでエリクサーに乗りましょう。

インストール

OSXで実行している場合、インストールはHomebrewを使用するのと同じくらい簡単です。
~ brew update
~ brew install erlang
~ brew install elixir

これを実行すると、次のコマンドを実行できるようになります。

~ elixir -v
> Elixir 1.0.2

これでElixirが正しくインストールされたので、 Interactive Elixirを開いて、いくつかの基本的な一般的なタイプを試してみることができます。

エリクサーの種類

次のように入力して、 InteractiveElixirREPLを起動します
> iex

変数:

iex(1)> name = "rbin"
#=> "rbin"

原子:

Elixirでは、Atomは定数であり、その名前はそれ自体の値です。
iex(2)> :this_is_an_atom
#=> :this_is_an_atom
iex(3)> :my_atom == :atom
#=> false

タプル:

タプルを定義するためにカーリーブレース表記を使用します。 Elixirでは、タプルはすぐにメモリに保存されます。つまり、タプルのサイズを取得したり、タプル要素にアクセスしたりするのは高速ですが、要素の更新や追加には、タプル全体をメモリにコピーする必要があるため、コストがかかります。

iex(4)> tuple = {:hello, "world"}
#=> {:hello, "world"}
iex(5)> elem(tuple, 1)
#=> "world"

リスト:

Elixirでは、リストはリンクリストとしてメモリに保存されます。 要素を追加することでリストを簡単に更新できますが、要素のサイズを把握するためにリスト全体をトラバースする必要があるため、要素の追加はよりコストがかかります。

iex(8)> list = [1, 2, :atom]
#=> [1, 2, :atom]
iex(9)> ["string"] ++ list
#=> ["string", 1, 2, :atom]
iex(10)> list ++ [31]
#=> [1, 2, :atom, 31]

リストのHead&Tailの取得など、リストで使用できる非常に便利な組み込み関数があります。

iex(11)> hd(list)
#=> 1
iex(12)> tl(list)
#=> [2, :atom]

匿名関数:

Elixirでは、関数は第一級市民です。つまり、関数を引数として他の関数に渡すことができます。 以下では、関数を含むaddという名前の変数を定義し、それを引数としてis_function /1func渡します。

iex(14)> add = fn a, b -> a + b end
#Function<12.90072148/2 in :erl_eval.expr/5>

iex(15)> add.(13, 31)
#=> 44

iex(16)> is_function(add)
#=> true

プロジェクトの整理(ミックス)

Elixirには、Mixという非常に便利なツールが付属しています。 Mixは、プロジェクトを非常に簡単に生成、整理、コンパイル、およびテストできるビルドツールです。 また、依存関係の管理も簡単になります。 (常に厄介なテーマです!)Mixを使用して新しいプロジェクトを作成するには、次のようにします。
~ mix new myapp --module MyApp
これにより、 myappという名前のディレクトリが作成され、その中にいくつかのファイルが含まれます。 また、 lib/myapp.ex内にモジュールMyAppを定義します。
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/myapp.ex
* creating test
* creating test/test_helper.exs
* creating test/myapp_test.exs


Your mix project was created successfully.
You can use mix to compile it, test it, and more:

cd myapp
mix test

ご覧のとおり、基本的なプロジェクト構造に必要なすべてのファイルを取得しています。 これは、Elixirに付属している優れた機能の1つだと思います。 プロジェクト管理ツールがあると、非常に便利で時間の節約になります。

ファイルmix.exsは、プロジェクトの構成や依存関係の管理などに使用されるメインファイルです。テスト/フォルダーを取得します。このフォルダーで、プロジェクトの非常にルビーのようなテストを記述できます。 もちろん、プロジェクトのソースファイルを含むlib/folderを取得します。 アプリでミックステストを実行すると、次のようになります。
$ mix test
Compiled lib/myapp.ex
Generated myapp.app
.

Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures

Randomized with seed 543313

並行性

Erlangと同じように、Elixirは並行性のために「アクター」モデルを使用します。 すべてのコードはプロセス内で実行され、これらのプロセスは互いに分離されています。 プロセスを生成し、プロセス間でメッセージ送受信することにより、Elixirで完全に並行したプログラムを作成できます。

Elixirでは、別の関数を引数として取るspawn関数を使用してプロセスを開始します。

iex(1)> spawn(fn -> IO.puts 1 + 1 end)
#=> 2
#PID<0.55.0>

ご覧のとおり、1 + 1を出力するプロセスを生成し、そのプロセスIDも返しました。 このプロセスIDを返すと、変数に割り当てて、プロセスにメッセージを送信するために使用できるので便利です。 その前に、プロセスに送信するメッセージを取得するための受信メカニズムを作成する必要があります。 (これは、 Interative Elixirセッションで1行ずつ実行できます。)

それが済んだら、 area_loopを評価するプロセスを作成し、それをpidに割り当てることができます。

pid = spawn(fn -> Geometry.area_loop() end)
#=> #PID<0.40.0>

次に、 :rectangleアトムを受信するか:circleアトムを受信するかに応じて、事前定義されたコードが一致するメッセージをpidに送信できます。

send pid, {:rectangle, 2, 3}
#=> Area = 6
# {:rectangle,2,3}

send pid, {:circle, 2}
#=> Area = 12.56000000000000049738
# {:circle,2}

Process.aliveを使用して、プロセスがまだ実行されているかどうかを確認できますか? 関数。

Process.alive?(pid)
#=> false

結論

このブログでは、表面を傷つけたことさえありません。 Elixirにはすばらしい機能がたくさんありますので、ぜひチェックしてみてください。 途中で役立つ学習リソースを以下にリストしましたが、出発して飛び込む前に、Elixirについての私の個人的なお気に入りのいくつかを以下に示します。

  • ルビーのような構文とErlangのようなプリミティブで、理解するのは簡単でした
  • その背後には素晴らしいコミュニティがあります
  • 並行性モデルは私にはなじみがあり、非常に強力です
  • ミックスは天の恵みであり、多くの時間を節約します
  • Elixirは私たちにすべてを文書化するように勧めています
  • これにより、分散型アプリの構築がはるかに混乱の少ない戦場になります
  • 私はエリクサーが長い道のりを進んでいるのを見ることができます。

資力

エリクサーを短時間で習得するのに非常に役立つと思ったリソースは次のとおりです。

  • http://elixir-lang.org/getting-started/introduction.html
  • https://pragprog.com/book/elixir/programming-elixir
  • https://teamgaslight.com/blog/the-best-resources-for-learning-elixir
  • http://exercism.io

*出て行って、そのエリクサーを飲みましょう! – @rbin *