2017-09-26 4 views
2

나는 꽤 이해할 수없는 코드 조각을 발견했습니다.얼랭 - 기본 오류 코드 이해에 대한 도움말

% 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"}. 

마지막 줄의 "message"는 모듈에 정의 된 원자입니까? 나는 그 부분을 정말로 이해할 수 없다.

이해하려는 시도는 다음과 같습니다. 첫 번째 요소가 내용을 설명하는 튜플에 저장합니다. 예 : {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...