エリキシル

Erlangはその機能においてユニークなプラットフォームであり、それにもかかわらず、この言語は今でもエキゾチックです。 いくつかの理由があります。 たとえば、厳密な算術演算、珍しい構文、機能。 これらは欠陥ではありません。 これらは、ほとんどのプログラマが使用できない、または使用したくないものです。



数日前、Jose Valimは自分のリポジトリで、 Erlangの上に構築された言語のプロジェクトを公開しました。 この言語には、単純なオブジェクトモデルとRubyのような構文があります。 カットオフプレスのドキュメントと簡単な例を示すビデオの下。



免責事項:%ユーザー名%、エリクサーができることとできないことについて結論を出す前に、少なくともreadmeを見てください。





Elixirは、Erlangの上で実行されるプログラミング言語です。 Erlangと同様に、厳密なコンピューティング、1回限りの割り当て、動的型付けを備えた関数型言語であり、分散型のフォールトトレラントなノンストップのホットスワップ可能なアプリケーションをサポートするように設計されています。 Elixirを使用すると、データ型を変換せずにErlangモジュールを呼び出すことができるため、Erlangコードを呼び出すときにパフォーマンスが低下することはありません。



ElixirとErlangの主な違いは、構文とオブジェクトの向きです。 Elixirは、主にRubyに基づいた非常にシンプルなオブジェクトモデルと構文を提供します。



現在、主なタスクは標準ライブラリを開発することです。 既存の標準ライブラリのほとんどはElixir自体で記述されており、開発に貢献するためにErlangを知る必要はありません。 OTPの原則を十分に理解することができます。



開始するには、まずリポジトリをコンピューターにクローンし、コンパイルして検証する必要があります。



$ git clone https://github.com/josevalim/elixir.git $ cd elixir $ make test $ bin/elixir -v Elixir 0.1.0
      
      





Erlangのように、Elixirのコメントは「%」で示されます。

 % This is a commented line
      
      





さらに、「%=>」は式の値を示します。

 1 + 1 % => 2
      
      







Elixirは整数と小数をサポートしています:

 2 + 15 % => 17 - 13 * 10 % => -130 1986 - 1985 % => 1 5 / 2 % => 2.5 4 / 2 % => 2.0
      
      





Rubyの場合と同様、任意の構成体はオブジェクトです。 番号のメソッドを呼び出すことができます:

 -1.abs % => 1 5.div(2) % => 2 %surprise ! 1.+(2) % => 3
      
      







Elixirの原子は(Rubyのように)シンボルと呼ばれます。 しかし、構文はLispから借用されています(JoseはTwitterでこれを辞書で ":"を使いたいと説明しました):

 'atom 'Atom 'atom_without_spaces '"Atom with Spaces"
      
      







リストはElixirで最も便利な構造です(他の関数型言語と同様)。何でも含めることができ、メソッドのセットがあります:

 % Some list with elements ['atom, 1, 2, 3, { 'some, 'tuple }] % An empty list [] [1, 2, 3].length % => 3 ['a, 'b, 'c][1] % => 'b [1, 2, 3] + [4, 5, 6] % => [1,2,3,4,5,6]
      
      





ErlangおよびElixirのリストはリンクリストとして実装されているため、アイテムの事前追加は以下よりもはるかに高速です。

 list = [2,3,4] % Don't do this: [1] + [2,3,4] % => [1,2,3,4] [0,1] + [2,3,4] % => [0,1,2,3,4] % Do this instead: [1|list] % => [1,2,3,4] [0,1|list] % => [0,1,2,3,4]
      
      





リストの真の力は、関数でリストを使用するときです

 [1, 2, 3].map do (x) x * 2 end % => [2, 4, 6] [1, 2, 3].foldl 0, do (x, acc) acc + x end % => 6
      
      







Erlangの行は、文字のリストで表されます。

 "hello" == [104, 101, 108, 108, 111]
      
      





これは、各文字が8バイトのメモリ(少しでもない!)を占有するため、高価です。 Elixirは、文字列をutf8バイナリ文字列として実装します。

 % The famous "hello world" string "hello world" % A string converted to its underlying binary: "hello".to_bin % => <<[104, 101, 108, 108, 111]>> % A string converted to a char list: "hello".to_char_list % => [104, 101, 108, 108, 111] % Strings are UTF-8 "Arrow ⇧ up".length % => 10
      
      





これは大きな変更です。 変換が必要なオブジェクトは文字列のみです。

 % Converting a string_from_erlang to Elixir's String String.new string_from_erlang % Where string_from_erlang is either a binary: <<[104, 101, 108, 108, 111]>> % Or a char_list: [104, 101, 108, 108, 111] % Converting a string_from_elixir to Erlang "string_from_elixir".to_bin "string_from_elixir".to_char_list
      
      





最後に、文字列は補間をサポートします:

 "string #{'with} interpolation" % => "string with interpolation" "1 + 1 = #{1 + 1}" % => "1 + 1 = 2"
      
      







関数は、他の関数型言語と同様に、Elixirの重要な部分です。 関数は、「do」または「->」を使用して作成できます。

 my_function = do 1 + 2 end my_function() % => 3 another_function = -> 1 * 2 end another_function() % => 2
      
      







Erlangと同様に、Elixirはパターンマッチングとユニット割り当てをサポートしています。

 % Let's bound the variable x to 'foo x = 'foo % Now let's match a tuple with other tuple. % Since x is already bound, we are comparing x with 'baz and it will fail: { x, y } = { 'baz, 'bar } % In this case, we compare 'x with 'foo and it matches. % Since y is unbound, we assign 'bar to it: { x, y } = { 'foo, 'bar } x % => 'foo y % => 'bar [h|t] = [1,2,3] h % => 1 t % => [2,3] % Raises an error because h was already assigned to 1 and 1 does not match 2 [h|t1] = [2,3,4]
      
      





Eralngと同様に、パターンマッチングは関数シグネチャで使用されます。

 module Math def fibonacci(0) 0 end def fibonacci(1) 1 end def fibonacci(n) fibonacci(n - 1) + fibonacci(n - 2) end end Math.fibonacci(0) % => 0 Math.fibonacci(1) % => 1 Math.fibonacci(3) % => 2 Math.fibonacci(10) % => 55
      
      







Erlangメソッドの呼び出しは非常に簡単です。

 % Accessing the is_atom BIF from Erlang. % This is the same as `is_atom(foo)` in Erlang. Erlang.is_atom('foo) % => true % Accessing the function delete from module lists. % This is the same as `lists:member(1, [1,2,3])` in Erlang. Erlang.lists.member(1, [1,2,3]) % => true
      
      







Elixirオブジェクトモデルにはいくつかの側面があります:



 object Person def constructor(name, age) { 'name: name, 'age: age } end def name @name end def age @age end def name(value) self.set_ivar('name, value) end end person = Person.name('john, 24) another_person = person.name('john_doe) person.name % => 'john person.age % => 24 another_person.name % => 'johh_doe another_person.age % => 24
      
      







これはElixir機能のごく一部の説明です。 リポジトリは、優れた概要ドキュメントを公​​開しています 。 以下のビデオは、言語の仕組みの簡単な例を示しています。






All Articles