2017-12-06 4 views
0

Dies ist mein erstes Mal Tauchen in Erlang, aber ich komme aus der Welt von Prolog.Erlang Undefined Funktion Global

Ich kann nicht zu verstehen scheinen, warum nach dem Laden des Moduls, und sagen, es eine Funktion auszuführen, scheint es zu einer anderen separaten Funktion zu laufen.

Die Frage Erlang - undefined function scheint verwandt, aber sieht nicht so aus, als ob es in meinem Fall gilt. Ich kann die Module kompilieren und laden.

Hier ist meine Eshell Ausgabe:

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> 

Im chat_client.erl Datei, gibt es keine Übereinstimmung zu 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(). 

Aus dem Stand der Datei message_router.erl I kann eine globale Funktion sehen eine Übereinstimmung (oder so denke ich):

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

Was mache ich in diesem Fall falsch?

Antwort

1

Im Modul global gibt es eine Funktion send/2, aber keine send_message/2. ändere deinen message_router auf:

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