2017-09-26 11 views
2

私はかなり理解できないコードを見つけました。Erlang - 基本的なエラーコードの理解

% spawn process which waits for a message and prints it 
Pid = spawn(fun() -> 
    receive 
    X -> io:fwrite("I received: ~p~n", [X]) 
    end 
end), 
% send a message to the new process 
Pid ! {message, "Hello"}. 

最後の行で、モジュールに定義されているアトムは「メッセージ」ですか?私はその部分を本当に理解できません。

これを理解する私の試みは、最初の要素が内容を記述しているものをタプルに保存することです。例:{celsius, 55}。あまり明確でないのは、原子メッセージがモジュール内で定義されていないということです。定義する必要はありますか?宣言は必要ありませんので、使用する前に原子を定義する必要はありません。私は正しいですか?

ありがとうございました!

コードはhereです。

+1

はい。原子は一般的にリテラルです。それらは、遭遇するとアトムテーブルに追加されます。別のGC対応言語で文字列リテラルを使用する方法を使用してください。 erlでコードを実行し、参照してください!ここに投稿するよりもはるかに楽しいです。 – zxq9

答えて

3

正しい - 原子を自由に使用できます。彼らはどこにでも定義されていません。

+0

そういうものを使っても問題ありませんが、これを覚えておいてください:https://stackoverflow.com/a/20518160/4366224 –

+0

ありがとう!原子メモリの漏れに関するリンクにも感謝します。非常に有益! – Arian

0

原子は自由に使用できます。すべての一意の原子が原子表に入力されます。アトムテーブルは決してガベージコレクションされません。 ERTSインスタンスのデフォルトの最大原子数は1048576です。この制限は、起動時に+ tオプションを使用することで増やすことができます。 more information regarding limits。診断目的のために、使用可能なアトムを使い果たしていないことを保証するために、erlang:memory(atom)-elrang:memory(atom_used)呼び出しを使用することができます。原子が使い果たされると、警告なしにERTSの即時終了につながります。

0

基本的に、あなたは正しく理解しました。あなたが望むすべての原子を使うことができ、どこにも定義されていません。いくつかの「特別な単語」を除き、Erlang:

receive, case, if, throw, catch, else... 
関連する問題