「エリクシル入門」-ロシア語のエリクシルに関する最初の本

Elixirの概要 これは突然起こりましたが、喜びの海をもたらしました。 最後に、本の出版社は、エリクサーの開発者の関心に注目し、 この言語に関する最初の本をロシア語でリリースしました。 翻訳のための出版物の選択を期待しています-これは、言語に精通したい、または既に知り合いであり、可能性についてさらに学ぶ準備ができている人々のための資料です。



Elixirは、スケーラブルで簡単にサポートされるアプリケーションを作成するために設計された動的で機能的なプログラミング言語です。 Erlang VMに基づいており、低遅延の分散型フォールトトレラントシステムに効果的であると同時に、Web開発や組み込みソフトウェアの分野でも使用されています。






「Elixirの紹介」は、プログラミング言語に関する文献の標準的な代表です。 ストーリーは、構文の基本から高度なモジュールとテクニックまで、順番に実施されます。 例は総合的なものですが、同時に、何が問題になっているかがすぐに明らかになるような方法でテキストを示しています。 言語が表現力豊かであり、Erlangから継承された一連のツールが印象的であることを考えると、退屈してはいけません。



次に、各章をさらに詳しく検討します。



第1章自分を慰める



ここではすべてが標準です。 言語を使用するための準備、基本の基本、および対話型シェルの使用に関する短いマスタークラスについて説明します



第2章関数とモジュール



この本を20分間使った後、私たちはすでに言語の基本的な魅力と美しさ-機能について紹介されています。 異常なものは言語の要素の1つにすぎないように思われます。 しかし、実際には、Elixirの機能はその基礎です。



そしてすでにここで、言語の最初の異常な特徴が明らかにされています。 たとえば、同様のデザインの場合、パイプを介して機能を組み合わせる



Enum.map(List.flatten([1, [2], 3]), fn x -> x * 2 end)
      
      





エレガントな外観に変わります



 [1, [2], 3] |> List.flatten |> Enum.map(fn x -> x * 2 end)
      
      





それとも、この機能が好きですか? 関数にコメントを追加すると、すぐに完全なドキュメントの組み込み言語ツールを受け取ることができます。



第3章原子、タプル、およびパターンマッチング



本での経験は、あなたがすでによく知っている言語に依存します。 以前に関数型言語に遭遇したことがないか、Rubyの構文に精通していない場合は、ここから啓示が始まります。



最初に、Elixirはatomデータ型を使用します。 特別なものではないようです。このタイプの要素は、名前と一致する値を持っています。



 iex(1)> :test :test
      
      





しかし、(言語の他のメカニズムを使用する場合)このようなシンプルなアイデアは、Elixirのプログラミングスタイルに大きな影響を及ぼします。



 defmodule Drop do def fall_velocity(:earth, distance) do :math.sqrt(2 * 9.8 * distance) end def fall_velocity(:moon, distance) do :math.sqrt(2 * 1.6 * distance) end def fall_velocity(:mars, distance) do :math.sqrt(2 * 3.71 * distance) end end
      
      





たとえば、同じ関数はここで3回再定義されません。 実際、これらは3つの異なる関数であり、それぞれの関数は、最初の引数原子のサンプルと比較して選択できます。



これは、奇跡を起こすことができる主要な言語テクニックです。 そして、本はそれをする方法を教えます。 保護条件を使用する場合でも、通常の原子よりも複雑な場合でも、サンプルとの比較。



第4章ロジックと再帰



関数型言語のプログラムは通常、標準のループを使用するよりも再帰を使用して作成されます。 この章では、コンパイラが最適化できる再帰の書き方をお読みください。 セキュリティ条件と論理用語の両方で使用されるサンプルとの比較により、再帰は非常にエレガントで異常です。



 defmodule Fact do def factorial(n) do factorial(1, n, 1) end defp factorial(current, n, result) when current <= n do new_result = result * current IO.puts("#{current} yields #{new_result}.") factorial(current + 1, n, new_result) end defp factorial(_current, _n, result) do IO.puts("Finished!") result end end
      
      







第5章人間の相互作用



ElixirとErlangの主な技術的な違いの1つは、ストリングメカニズムの完全な作り直しです。 現在、これらは単なる文字のリストではなく、Unicodeがサポートできる本格的なバイナリデータ型です。 そして、ユーザーと対話できるのは、そのおかげです。



第6章リスト



あなたの言語への関心を喚起できることを願っています。 興味深い構文上の機能とコアのクールなアイデアに加えて、すべてが驚くほど高速に動作します。 正当な理由により、Elixirは、作業速度とGoおよびRastで、Rubyでの開発速度で比較されています。



エリクサーは、リスト、値の長いシーケンスに対する優れたサポートを備えています。 再帰のメリットを評価し、最小限の労力で大量の作業を実行できるようにします。 これは関数型言語の標準的なデータ型ですが、多くのことを話し合う必要があります。



 defmodule Pascal do def add_row(initial) do add_row(initial, 0, []) end def add_row([], 0, nal) do [0 | nal] end def add_row([h | t], last, new) do add_row(t, h, [last + h | new]) end end
      
      





人間の顔をしたこのような関数型プログラミングは次のとおりです。



第7章名前/値のペア



時々彼らは私に尋ねます。 Elixirにはオブジェクトがないので、構造化データをどのように使用しますか? タプルとリストは優れていますが、名前で値を取得することはできません。 Elixir、若いが、すでに成熟した( プロダクションrediでさえ )言語。 したがって、開発者はこの問題を解決するメカニズムを提供しています。 Elixirには、キーで値を取得できるデータ型があります。 そして、この章では、それらが考慮されます-辞書から構造まで。



第8章高階関数とリストジェネレーター



高階関数、または引数に他の関数をとる関数は、Elixirがすべての素晴らしさを発揮するのに役立ちます。 他の言語で同様の機能を実装することは不可能とは言えません-これはほとんどすべての言語で可能ですが、Elixirでは高階機能は人工的で異質な構成としてではなく、言語の自然な部分として解釈されます。



最も興味深い章ではありませんが、これらの機能について学ぶことは間違いではありません。



第9章プロセス



プログラミングの経験が豊富であれば、退屈するかもしれません。 私はあなたを喜ばせるために急いで、エリクサーのキラー機能について最も興味深いものが今始まります!



Elixirを説明するとき、特定のプロセスが通常利点として言及されます。 彼らは、均一性を達成し、プログラムの速度を上げ、コードのスケーリングとホットスワップに使用できると言いますが、それらが何であり、言語自体の中でどのように見えるかはまったく明確ではありません。



実際、プロセスはプログラムの別の組織単位であり、機能とモジュールはメッセージを送受信できる独立したコンポーネントです。 実行中のプログラムは一連のプロセスです。



この章では、対話もプロセスである対話型シェルで始まります。 プロセスについて多くの詳細が述べられており、それらを操作するための追加のツールも検討されています。



第10章例外、エラー、およびデバッグ



Elixirでのデバッグでは、本格的なネイティブツールがないため、すべてがスムーズに進みません。 最も人気のあるものは、 Pry



(Rubyから来た)と:dbg



(Erlangから)です。 実際、それらは使用するのに非常に快適であり、本はそれらの2番目の良い分析を提供します。



第11章静的分析、型仕様、およびテスト



プログラミングには、構文エラー、ランタイムエラー、セマンティックエラーの3つの主要なエラークラスがあります。 Elixirコンパイラは、構文エラーを検出して報告します。 論理エラーは、Elixirに1つの事柄、つまり他の事柄を要求しても残ります。 ロギングとトレースはこれらのエラーを見つけるのに役立ちますが、最初からエラーが発生しないようにすることをお勧めします。 これにより、静的分析、型仕様、および単体テストが役立ちます。 これについては、この章ですべて説明します。



エリキシルには、これらの分野で非常に重要な機能があります。 たとえば、ドキュメントに組み込まれたテスト:



 defmodule Drop do @doc """         (  ̆ ̆) iex(1)> Drop.fall_velocity(:earth, 10) 14.0 iex(2)> Drop.fall_velocity(:mars, 20) 12.181953866272849 iex> Drop.fall_velocity(:jupiter, 10) ** (CaseClauseError) no case clause matching: :jupiter """ def fall_velocity(planemo, distance) do gravity = case planemo do :earth -> 9.8 :moon -> 1.6 :mars -> 3.71 end :math.sqrt(2 * gravity * distance) end end
      
      





これで、ドキュメントが常に最新のものになることを確認できます!



第12章構造化データの保存



データをどこかに保存する必要があるため、純粋な関数をどのように使用したいとしても、実際にはこれは不可能です。 これを行うために、Erlangには多数の組み込みツールがあり、幸いにもElixirから使用できます。 この章では、ETSとMnesiaについて説明します。



外部の依存関係として大根が不要になったと想像してください。 結局のところ、その「代替」は言語に直接組み込まれ、すぐにサポートされます。



第13章OTPの基本



ErlangとElixirの世界に入るすべての人は、特定のOTPについて耳にします。これは、経験豊富な同僚によって議論されています。 皮質下では、これはある種の非常にクールなものであり、信じられないほど便利であり、日常の開発における単なるマストヘッドであると延期されます。 しかし、それが何であるかは明確ではありません。



OTPは、並列化された信頼性の高いアプリケーションを作成するためのフレームワークであることがわかりました。 Erlang仮想マシンのすべてのチップを使用し、プログラマは実装の詳細についてではなく、ビジネスロジックについてのみ考えることができます。



最も一般的なモジュールは、SupervisorとGenServerです。 次のようになります。



 defmodule DropServer do use GenServer defmodule State do defstruct count: 0 end def start_link do GenServer.start_link(__MODULE__, [], [{:name, __MODULE__}]) end def init([]) do {:ok, %State{}} end def handle_call(request, _from, state) do distance = request reply = {:ok, fall_velocity(distance)} new_state = %State{count: state.count + 1} {:reply, reply, new_state} end def handle_cast(_msg, state) do IO.puts("So far, calculated #{state.count} velocities.") {:noreply, state} end def handle_info(_info, state) do {:noreply, state} end def terminate(_reason, _state) do {:ok} end def code_change(_old_version, state, _extra) do {:ok, state} end def fall_velocity(distance) do :math.sqrt(2 * 9.8 * distance) end end
      
      





それらの詳細については、 こちらこちらをご覧ください 。 または、本の現在の章で。



そして、Elixirは、すべてのアーランジストが夢見ているもの、Mixユーティリティを提供します。

彼女のレビューも本の中にあります。



第14章マクロを使用したElixir言語の拡張



ElixirとErlangを区別する次の機会は、高度なメタプログラミングです。 マクロの作成により実装されます。 外部では、マクロは関数に非常に似ており、 def



ではなくdefmacro



で始まるという点でのみ異なります。 ただし、マクロの機能は機能とはまったく異なります。 これにより、最愛の人に負けないクールなDSLを作成できます。



第15章フェニックス



さて、本はフェニックスのような重要なトピックで終わります。 これは、Railsと比較したいWebフレームワークです。 フェニックスは鉄道の哲学といくつかのアプローチを継承しましたが、現在は徐々に撤廃しています。 しかし、Phoenixは、当時のRails for Rubyと同じElixirのエンジンであることに注意してください。



フェニックスの入門コースは、本またはこのシリーズの記事で読むことができます。



結論



この本は非常に優れています。 ここ数ヶ月、私はロシア語圏の読者に美しいエリクサーを紹介するWunshプロジェクトに取り組んでいます。 そして、この本を読むことは私にとってまだ興味深かったです。言語のなじみのある部分で作業する際にいくつかのニュアンスを学び、以前に出会ったことのない他の可能性について学びました。



私のレビューが役に立つことを願っています。 良い一日を過ごして、もっと役立つ本を読んでください!



PS Friends、Telegramのグループチャンネルに登録してください。 合計600人の参加者がいれば、本Metaprogramming Elixirを再生します。



All Articles