Атомы гарантированно будут уникальными и цельными, в отличие от e. Например, значения констант с плавающей точкой, которые могут отличаться из-за неточностей при кодировании, отправке их по проводам, декодировании на другой стороне и преобразовании обратно в плавающую точку Независимо от того, какую версию интерпретатора вы используете, он гарантирует, что атом всегда будет иметь одинаковое «значение» и будет уникальным.
Erlang VM хранит все атомы, определенные во всех модулях, в глобальной таблице атомов .
В Erlang отсутствует тип данных Boolean. Вместо этого атомы true
и false
используются для обозначения логических значений. Это мешает делать такие неприятные вещи:
#define TRUE FALSE //Happy debugging suckers
В Erlang вы можете сохранять атомы в файлы, читать их обратно, передавать по проводам между удаленными виртуальными машинами Erlang и т. Д.
В качестве примера я сохраню пару терминов в файл, а затем прочту их обратно. Это исходный файл Erlang lib_misc.erl
(или его самая интересная часть для нас сейчас):
-module(lib_misc).
-export([unconsult/2, consult/1]).
unconsult(File, L) ->
{ok, S} = file:open(File, write),
lists:foreach(fun(X) -> io:format(S, "~p.~n",[X]) end, L),
file:close(S).
consult(File) ->
case file:open(File, read) of
{ok, S} ->
Val = consult1(S),
file:close(S),
{ok, Val};
{error, Why} ->
{error, Why}
end.
consult1(S) ->
case io:read(S, '') of
{ok, Term} -> [Term|consult1(S)];
eof -> [];
Error -> Error
end.
Теперь я скомпилирую этот модуль и сохраню некоторые термины в файл:
1> c(lib_misc).
{ok,lib_misc}
2> lib_misc:unconsult("./erlang.terms", [42, "moo", erlang_atom]).
ok
3>
В файле erlang.terms
мы получим это содержимое:
42.
"moo".
erlang_atom.
Теперь давайте прочитаем это обратно:
3> {ok, [_, _, SomeAtom]} = lib_misc:consult("./erlang.terms").
{ok,[42,"moo",erlang_atom]}
4> is_atom(SomeAtom).
true
5>
Вы видите, что данные успешно считываются из файла, а переменная SomeAtom
действительно содержит атом erlang_atom
.
lib_misc.erl
содержание взято из "Программирование Erlang: Программное обеспечение для параллельного мира" Джо Армстронга, изданного The Pragmatic Bookshelf. Остальной исходный код здесь .