2017-12-06 3 views
0

これはErlangで初めてのダイビングですが、私はPrologの世界から来ました。Erlang未定義関数グローバル

モジュールを読み込んだ後に関数を実行すると、別の別の関数が実行されたように見えるのはなぜか分かりません。

質問Erlang - undefined functionと関連しているようですが、私の場合は当てはまるように見えません。モジュールをコンパイルして読み込むことができます。ここで

は私ESHELL出力です:

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> 

chat_client.erlファイルでは、send_message/2に一致するものがない:

-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グローバル関数が一致するかどうかを確認することができます(または私は思います)。

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 }).