Elixirプログラミング言語入門
公開: 2022-03-11ブログの投稿、ハッカーのニューススレッド、お気に入りの開発者のツイートを読んだり、ポッドキャストを聴いたりしている場合は、この時点でおそらくElixirプログラミング言語について聞いたことがあるでしょう。 この言語は、オープンソースの世界でよく知られている開発者であるJoseValimによって作成されました。 彼は、Ruby on Rails MVCフレームワークから、またはdeviseとsimple_formのruby gemから、彼とPlataformatecの同僚がここ数年取り組んできたものから知っているかもしれません。
Jose Valimによると、Elixirは2011年に生まれました。彼は、ルビーの世界での並行性の問題を解決するための優れたツールがないため、新しい言語を構築するという考えを持っていました。 当時、並行性と分散型の集中言語の研究に時間を費やした後、彼は、JVMで実行されるErlangとClojureという2つの好きな言語を見つけました。 彼はErlang言語(Erlang VM)で見たものすべてが好きで、Clojureが得意だったポリモーフィズム、メタプログラミング、言語拡張性の属性など、見なかったものは嫌いでした。 そのため、Elixirは、Clojureの代替手段と、優れた拡張性をサポートするErlang仮想マシンで実行される動的言語を使用することを念頭に置いて生まれました。
Elixirは、それ自体を、不変の状態を備えた動的で機能的な言語であり、シンプルでモダンで整然とした構文でスケーラブルで保守可能なアプリケーションを構築するために設計された並行性へのアクターベースのアプローチであると説明しています。 この言語は、低遅延とフォールトトレランスの特性で知られる、バトルプルーフで高性能な分散型仮想マシンであるErlang仮想マシンで実行されます。
コードを見る前に、Elixirは成長しているコミュニティに受け入れられていると言っておく価値があります。 今日Elixirを学びたい場合は、本、図書館、会議、交流会、ポッドキャスト、ブログ投稿、ニュースレター、あらゆる種類の学習ソースを簡単に見つけることができ、Erlangの作成者にも受け入れられています。
いくつかのコードを見てみましょう!
Elixirをインストールします:
Elixirのインストールは、すべての主要なプラットフォームで非常に簡単であり、ほとんどのプラットフォームでワンライナーです。
Arch Linux
Elixirは、公式リポジトリを通じてArchLinuxで利用できます。
pacman -S elixir
Ubuntu
UbuntuにElixirをインストールするのは少し面倒です。 しかし、それでもそれは十分に簡単です。
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb apt-get update apt-get install esl-erlang apt-get install elixir
OS X
Homebrewを使用してOSXにElixirをインストールします。
brew install elixir
IExに会う
インストールが完了したら、シェルを開きます。 Elixirで開発したい場合は、シェルで多くの時間を費やします。
ElixirのインタラクティブシェルまたはIExはREPL-(Read Evaluate Print Loop)で、Elixirを探索できます。 そこに式を入力すると、すぐにフィードバックが得られるように評価されます。 コードは実際に評価され、コンパイルされていないことに注意してください。そのため、シェルでプロファイリングやベンチマークを実行しないようにしてください。
ブレークコマンド
IEx REPLを開始する前に知っておく必要のある重要なことがあります。それは、IExREPLを終了する方法です。
おそらく、 CTRL+C
を押して、ターミナルで実行されているプログラムを閉じることに慣れているでしょう。 IExREPLでCTRL+C
を押すと、ブレークメニューが開きます。 ブレークメニューに入ったら、もう一度CTRL+C
を押してシェルを終了しa
。を押すことができます。
ブレークメニュー機能については詳しく説明しません。 しかし、いくつかのIExヘルパーを見てみましょう!
ヘルパー
IExは、 h()
と入力してすべてを一覧表示するために、多数のヘルパーを提供します。
そして、これはあなたが見るべきものです:
それらは私のお気に入りのいくつかです、私はそれらもあなたのものになると思います。
-
h
先ほど見たように、この関数はヘルパーメッセージを出力します。 - 同じ関数である
h/1
ですが、現在は1つの引数が必要です。
たとえば、 String
strip/2
メソッドのドキュメントを見たいときはいつでも、簡単に次のことができます。
おそらく、Elixirでのプログラミング中に使用する2番目に便利なIExヘルパーはc/2
です。これは、特定のelixirファイル(またはリスト)をコンパイルし、2番目のパラメーターとしてコンパイルされたファイルを書き込むパスを期待します。
http://exercism.io/Elixirの演習の1つであるAnagram演習で作業しているとしましょう。
これで、anagram.exsファイルにメソッドmatch/2
を持つAnagram
モジュールが実装されました。 あなたは優れた開発者として、すべてが期待どおりに機能することを確認するためにいくつかの仕様を作成しました。
現在のディレクトリは次のようになります。
ここで、Anagramモジュールに対してテストを実行するには、テストを実行/コンパイルする必要があります。
今見たように、ファイルをコンパイルするには、コンパイルするファイルへの引数パスとして渡されるelixir
実行可能ファイルを呼び出すだけです。
ここで、セッションコンテキストでアクセス可能なAnagramモジュールを使用してIExREPLを実行するとします。 一般的に使用されるオプションは2つあります。 1つ目は、オプション-r
( iex -r anagram.exs
など)を使用してファイルを要求できることです。 2つ目は、IExセッションから直接コンパイルできます。
シンプル、そのように!
モジュールを再コンパイルする場合はどうでしょうか。 IExを終了し、再度実行してファイルを再度コンパイルする必要がありますか? いいえ! 十分なメモリがある場合は、IEx REPLで使用可能なすべてのヘルパーをリストしたときに、再コンパイルコマンドについて何かを見たことを覚えているでしょう。 それがどのように機能するか見てみましょう。
今回は、ファイルパスではなく、モジュール自体を引数として渡したことに注意してください。

これまで見てきたように、IExには、Elixirプログラムがどのように機能するかを学び、理解するのに役立つ他の便利なヘルパーがたくさんあります。
エリクサータイプの基本
数字
数字には2種類あります。 任意のサイズの整数と浮動小数点数。
整数
整数は、10進数、16進数、8進数、および2進数で記述できます。
Rubyの場合と同様に、大きな数字を書き込む場合は、アンダースコアを使用して3桁のグループを区切ることができます。 たとえば、次のように1億を正すことができます。
100_000_000
オクタル:
0o444
16進数:
0xabc
バイナリ:
0b1011
フロート
FloareはIEEE754倍精度です。 それらは16桁の精度と約10308の最大指数を持っています。
フロートは小数点を使用して書き込まれます。 ポイントの前後に少なくとも1桁の数字が必要です。 末尾の指数を追加することもできます。 たとえば、1.0、0.3141589e1、および314159.0-e。
アトム
アトムは名前を表す定数です。 それらは不変の値です。 先頭にコロンが付いたアトムと:
一連の文字、数字、アンダースコア、およびアットマーク@
を記述します。 また、先頭のコロン:
と、引用符で囲まれた任意の文字シーケンスを使用してそれらを記述することもできます。
アトムは非常に強力なツールであり、キーやElixirメソッドだけでなくerlang関数を参照するために使用されます。
ここにいくつかの有効な原子があります。
:name, :first_name, :"last name", :===, :is_it_@_question?
ブール値
もちろん、ブール値は真と偽の値です。 しかし、それらの良いところは、結局のところ、それらは単なる原子であるということです。
文字列
デフォルトでは、Elixirの文字列はUTF-8に準拠しています。 それらを使用するには、 "
または'
で囲まれた任意の数の文字を含めることができます。文字列内に補間式やエスケープ文字を含めることもできます。
一重引用符で囲まれた文字列は、実際にはバイナリのリストであることに注意してください。
匿名関数
関数型言語として、Elixirは基本型として無名関数を持っています。 関数を書く簡単な方法はfn (argument_list) -> body end
です。 ただし、関数には、複数の引数リストやガード句などを含む複数の本体を含めることができます。
プログラミングエリクサーの本の中で、デイブトーマスは、fn…endを文字列リテラルを囲む引用符であると考えていることを示唆しています。ここで、文字列値を返す代わりに、関数を返します。
タプル
タプルは不変のインデックス付き配列です。 それらはそのサイズを返すのが速く、その不変の性質のために新しい値を追加するのが遅いです。 タプルを更新すると、実際にはタプル自体のまったく新しいコピーが作成されます。
タプルは、配列の戻り値として非常によく使用されます。 Elixirでコーディングしていると、 {:ok, something_else_here}
がよく見られます。
タプルの記述方法は次のとおりです: {?a,?b,?c}
。
パターンマッチング
パターンマッチングについて知っておくべきことをすべて説明することはできませんが、これから読む内容には、始めるために知っておく必要のある多くのことが含まれています。
Elixirは=
を一致演算子として使用します。 これを理解するには、他の伝統的な言語で=
について知っていることを学ぶ必要があります。 従来の言語では、equals演算子は割り当て用です。 Elixirでは、equals演算子はパターンマッチング用です。
だから、それは左側の値を機能させる方法です。 それらが変数である場合、それらは右側にバインドされ、変数でない場合、elixirはそれらを右側と一致させようとします。
ピン演算子
Elixirは、左側の変数であるピン演算子に対して常にパターンマッチングを強制する方法を提供します。
リスト
Elixirでは、他の言語でわかっているように、リストは配列のように見えますが、そうではありません。 リストは、頭と尾で構成されるリンクされた構造です。
キーワードリスト
キーワードリストは、タプルペアのリストです。
あなたは単にそれらをリストとして書くだけです。 例:[{:one、1}、2、{:three、3}]。 リストを定義するためのショートカットがあります。その外観は次のとおりです:[1:1、3:3]。
キーワードリストからアイテムを取得するには、次のいずれかを使用できます。
Keyword.get([{:one, 1}, 2, {:three, 3}], :one)
または、ショートカットを使用します。
[{:one, 1}, 2, {:three, 3}][:one]
キーワードリストは値の取得に時間がかかるため、コストのかかる操作です。したがって、高速アクセスが必要なデータを保存する場合は、マップを使用する必要があります。
マップ
マップは、キーと値のペアの効率的なコレクションです。 キーには、キーとして必要な任意の値を指定できますが、通常は同じタイプである必要があります。 キーワードリストとは異なり、マップでは特定のキーに対して1つのエントリのみが許可されます。 それらは成長するにつれて効率的であり、連想配列が必要な場合に一般的に使用されるマップのElixirパターンマッチングで使用できます。
マップを作成する方法は次のとおりです。
%{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}
結論
Elixirは素晴らしく、理解しやすく、シンプルでありながら強力なタイプがあり、学習を開始するときに役立つ非常に便利なツールを備えています。 この最初のパートでは、Elixirプログラムが構築されているさまざまなデータ型と、それらを実行する演算子について説明しました。 後の部分では、関数型プログラミングと並行プログラミングであるElixirの世界をさらに深く掘り下げます。