2017-09-26 53 views
2

我偶然发现了一些我不太明白的代码。它看起来像这样:Erlang - 帮助理解基本的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

Basicaly,你理解正确。你可以使用你想要的所有原子,它们没有在任何地方定义。除了一些“特殊词”Erlang:

receive, case, if, throw, catch, else...