2017-12-06 13 views
0

이것은 얼랭으로 들어가는 첫 번째 시간이지만, 나는 프롤로그의 세계에서 왔습니다.얼랭 (Erlang) 정의되지 않은 함수 전역

모듈을로드하고 함수를 실행한다고 말하면 왜 다른 별도의 함수로 실행되는 것 같지 않은 것 같습니다.

질문 : Erlang - undefined function과 관련되어 보이지만 내 경우에는 적용되지 않는 것처럼 보입니다. 모듈을 컴파일하고로드 할 수 있습니다. 여기

내 Eshell 출력입니다 :

-module(chat_client). 

-compile(export_all). 

register_nickname(Nickname) -> 
    Pid = spawn(chat_client, handle_messages, [Nickname]), 
    message_router:register_nick(Nickname, Pid). 

unregister_nickname(Nickname) -> 
    message_router:unregister_nick(Nickname). 

send_message(Addressee, MessageBody) -> 
    message_router:send_chat_message(Addressee, MessageBody). 

handle_messages(Nickname) -> 
    receive 
     { printmsg, MessageBody } -> 
      io:format("~p received: ~p~n", [Nickname, MessageBody]), 
      handle_messages(Nickname); 
     stop -> 
      ok 
    end. 

start_router() -> 
message_router:start(). 

관련 파일 message_router.erl I에서 : chat_client.erl 파일에서

Erlang/OTP 20 [erts-9.1] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] 

Eshell V9.1 (abort with ^G) 
1> m(chat_client). 
Module: chat_client 
MD5: 32e278745489222df841e93620154031 
Compiled: No compile time info available 
Object file: h:/Program Files/erl9.1/bin/chat_client.beam 
Compiler options: [] 
Exports: 
     handle_messages/1 
     module_info/0 
     module_info/1 
     register_nickname/1 
     send_message/2 
     start_router/0 
     unregister_nickname/1 
ok 
2> chat_client:start_router(). 
yes 
3> chat_client:register_nickname(myatom). 
** exception error: undefined function global:send_message/2 
4> l(chat_client). 
{module,chat_client} 
5> chat_client:start_router().   
ok 
6> chat_client:register_nickname(myatom). 
** exception error: undefined function global:send_message/2 
7> l(message_router).      
{module,message_router} 
8> chat_client:start_router().   
ok 
9> chat_client:register_nickname(myatom). 
** exception error: undefined function global:send_message/2 
10> 

, send_message/2에 일치가 없다 전역 함수가 일치하는 것을 볼 수 있습니다 (또는 내가 생각하기에) :

send_chat_message(Addressee, MessageBody) -> 
    global:send_message(?SERVER, { send_chat_msg, Addressee, MessageBody }). 

register_nick(ClientName, ClientPid) -> 
    global:send_message(?SERVER, { register_nick, ClientName, ClientPid }). 

unregister_nick(ClientName) -> 
    global:send_message(?SERVER, { unregister_nick, ClientName }). 

이 경우 내가 뭘 잘못하고 있니?

답변

1

모듈 global에는 함수 send/2가 있지만 send_message/2은 없습니다. message_router를 다음으로 변경하십시오 :

send_chat_message(Addressee, MessageBody) -> 
    global:send(?SERVER, { send_chat_msg, Addressee, MessageBody }). 

register_nick(ClientName, ClientPid) -> 
    global:send(?SERVER, { register_nick, ClientName, ClientPid }). 

unregister_nick(ClientName) -> 
    global:send(?SERVER, { unregister_nick, ClientName }).