小さなもののためのアーラン。 第2章:モジュールと機能

画像 こんばんは、親愛なるハブロフチャン。 最小のアーランの研究を続けています。



前の章では、基本的なデータ型、リスト、およびタプルに注目しました。 また、パターンマッチングとリストジェネレーターの使用方法も学びました。



この章では、次のステップに進み、モジュールと機能を見ていきます。



チャプターリスト
第1章:データ型、変数、リスト、およびタプルgithub

第2章:モジュールと関数github

第3章:基本関数の構文(完全)github

第4章:型システムgithub

7つのアーランパフォーマンス神話





この章のソースコードはこちらです。



Erlangでは、すべての機能はモジュールに分割されます。 例外となる機能はありません。 「グローバル」と呼ぶ言語の標準関数(たとえば、 length



hd



tl



)も実際にはモジュール内にあります。 これらは「組み込み関数」( BIF-組み込み関数と呼ばれます)であり、 erlang



モジュールに属します。 このモジュールはデフォルトでインポートされるため、個別の機能として使用できます(モジュールのインポートについては以下を参照)。



モジュール



モジュールは、論理的に関連する機能のグループであり、1つの名前の下に統合されています。 大まかに言って、Erlangのモジュールは命令型言語の名前空間に似ています。 それらは、同様の目的を持つ機能を結合するために使用されます。 たとえば、リストを操作するための関数はlists



モジュールにあり、I / O関数はio



モジュールにあります。



関数を呼び出すにはModuleName:FunctionName(Arg1, Arg2, ..., ArgN)



構造を使用する必要があります。 たとえば、指定された番号を持つ送信されたタプルの要素を返す関数を呼び出します。 この関数はelement



と呼ばれ、 erlang



モジュールにあります。

 1> erlang:element(3, {23,54,34,95}). 34
      
      





モジュールを明示的に指定せずに関数を呼び出すこともできます。 これはもう少し書かれています。



モジュールには関数と属性が含まれます。



モジュール属性



命令型言語のように、属性は変数ではありません。 Erlangでは、モジュールの属性は、名前、バージョン、作成者、インポートされた関数のリストなどのメタデータです。 属性はコンパイラーによって使用されます。 また、ソースコード(バージョンや作成者など)を理解しなくても、ユーザーはモジュールから有用な情報を取得できます。



属性は、ファイルの最初にモジュールとともに示され、次の形式をとります: -Name(Arg).



。 モジュールの名前はアトムでなければなりません。 各属性は別々の行に示されています。



モジュールには、必要な属性を割り当てることができます。たとえば、作成中の気分を記述することができます。 事前定義された属性もいくつかあります。 そして今、私たちは最も一般的に使用されるものを検討することができます。 わかりやすくするために、最も基本的な数学演算である加算、減算、乗算、除算を実行する関数を含むモジュールを作成します。



-モジュール(名前)。

モジュールの名前は唯一の必須属性であり、最初に指定する必要があります。 これがないと、モジュールはコンパイルされません。 それは引数としてアトムを取ります-モジュールの名前。 モジュールにmySuperModule



ましょう。

 -module(mySuperModule).
      
      





これで、完全に機能するモジュールができました。 唯一の必須属性を宣言し、モジュールをコンパイルできるようになりました。 確かに、単一の機能がないため、まったく役に立ちません。 しかし、実際には-これは既製のモジュールです。



-export([Fnct1 /アリティ、Fnct2 /アリティ、...、FnctN /アリティ])

エクスポートされた関数のリスト-外部で利用できるモジュール関数のリスト。 受け入れられる属性は、関数のリストです。 ここで、 Fnct



は関数の名前、 Fnct



は引数の数(arity)です。 モジュールは、 add



subtr



mult



divis



(加算、減算、乗算、除算)の4つの関数をエクスポートします。 各関数は2つの引数を取ります。

 -export([add/2, subtr/2, mult/2, divis/2]).
      
      





エクスポートリストで指定しない関数は、モジュールの外部から呼び出すことができないことに注意してください。 モジュール内でのみ作業できます。

エクスポートは、モジュールでカプセル化を実現する手段です。 ご想像のとおり、エクスポートされた関数は命令型言語のパブリッククラスメソッドに類似しており、残りはプライベートなメソッドに類似しています。



-import(ModuleName、[Fnct1 / Arite、Fnct2 / Arity、...、FnckN / Arity])。

この属性は、2番目の引数で渡されるリストで指定された関数をModuleName



モジュールからインポートすることを示します。 インポートされた各モジュールは、 個別の属性で示されます。



機能をインポートする理由 上記のように、別のモジュールから関数にアクセスするには、 ModuleName:FunctionName()



という形式の完全な名前を指定する必要があります。 毎回モジュール名を指定したくない場合は、インポートする必要があります。 この属性は、C ++の#using



ディレクティブに類似してい#using



。 ただし、インポートを乱用しないでください。 関数の完全な名前はより明確です。 それを見ると、呼び出された関数がどのモジュールに属しているかすぐにわかります。 短い名前の場合、この関数がインポートされたモジュールを覚えておく必要があります。



完全な関数名を使用しますが、短い名前を使用する場合は、次のように記述できます。

 -import(io, [format/2]).
      
      





さて、たとえば、任意の属性を示しましょう。 それを著者の名前にします。

 -author("Haru Atari").
      
      





定義済み属性の完全なリストは、 公式ドキュメントに記載されています



モジュールをコンパイルしようとすると、エラーが発生します:

 1> c(mySuperModule). ./mySuperModule.erl:2: function add/2 undefined ./mySuperModule.erl:2: function divis/2 undefined ./mySuperModule.erl:2: function mult/2 undefined ./mySuperModule.erl:2: function subtr/2 undefined
      
      





エラーテキストからわかるように、コンパイラはインポートリストで指定した関数をファイル内で見つけることができません。 そして、これは論理的なものです。まだ追加していないからです。 このエラーを修正して、関数を作成しましょう。



機能



基本的な場合、Erlangの関数の形式は次のとおりですFnctName(Arg1, Arg2, ..., ArgN) -> FunctionBody.



関数の名前はアトムであり、その本体はコンマで区切られた1つ以上の式です。 関数本体の最後にドットが配置されます。 関数に式が1つしか含まれていない場合は、1行に記述する方がわかりやすいでしょう。

 add(X, Y) -> X + Y.
      
      





この関数は2つの引数を取り、それらの合計を返します。 return



という単語がないことに注意してください。 実際、Erlangでは、関数は常に最後の式の結果を返します。 私たちの場合、これは加算の結果です。 したがって、 return



という単語は必要ありません。



しかし、関数は常に1つの式で構成されています。 この場合、関数本体はコードの残りの部分の左にインデントされます。 この場合、関数は次のようになります。

 add(X, Y) -> doSomthing(), X + Y.
      
      





次に、残りの3つの関数を自分で追加します。 モジュールをコンパイルして、作成した内容を体験しましょう。



編集



Erlangで書かれたプログラムは、中間バイトコードにコンパイルされ、仮想マシンで実行されます。 これにより、Erlangで書かれたアプリケーションはクロスプラットフォームです。



Erlangにはいくつかの仮想マシンがあります。 しかし、最も一般的なのはBEAM(Bogdan /Björn's Erlang Abstract Machine)です。 多数の仮想マシン(JAMおよびWAM)がありますが、それらはほとんど使用されることはないため、考慮しません。



コンパイルには2つの方法があります。ターミナルから、またはErlangコマンドラインから。 両方のオプションを見てみましょう。



ターミナルからコンパイルするには、ファイルがあるディレクトリに移動し、 erlc FileName.erl



コマンドを呼び出す必要があります。 このモジュールでは、次のようになります(独自のパスがあります)。

 cd ~/Erlang-for-the-little-ones/02/sources erlc mySuperModule.erl
      
      





Erlangコマンドラインからこれを行うには、 cd("DirName")



コマンドを使用して必要なディレクトリに移動し、 cd("DirName")



コマンドを呼び出す必要がありc(ModuleName)



。 ファイルではなくモジュールの名前を渡すことに注意してください。 拡張子は不要です。

 1> cd("~/Erlang-for-the-little-ones/02/sources/"). /home/haru/Erlang-for-the-little-ones/02/sources ok 2> c(mySuperModule). {ok,mySuperModule}
      
      





コンパイルの結果、ファイルmySuperModule.erl



ファイルの横に表示されます。 これはコンパイルされたモジュールです。 これで使用できます。 試してみましょう:

 1> mySuperModule:add(2, 4). 6 2> mySuperModule:divis(6,4). 1.5
      
      





「コンパイルフラグ」をコンパイラに渡すことは可能です。 これを行うには、2番目の引数をc()



関数c()



フラグのリストc()



に渡します。 たとえば、モジュールをデバッグモードでコンパイルしましょう。

 c(mySuperModule, [debug_info]).
      
      





今はこれに焦点を合わせません。 別の章がこのトピックに当てられます。 ただし、興味がある場合は、キーのリストを使用して、ドキュメントのページで見つけることができます



おわりに



この章では、モジュールと機能を紹介しました。 また、使用できるようにコードをコンパイルする方法も学びました。



次の章では、関数の構文をさらに詳しく調べ、関数でパターンマッチングを使用する方法についても学習します。



読んでくれてありがとう。 気分が良く、つながりが悪い。



PS PMのタイプミスとエラーについてお知らせください。 ご理解いただきありがとうございます。



All Articles