Erlang 모듈에 문제가 있습니다. 여기에 제가 작성한 것이 있습니다 :Erlang 기본 일반 서버 디버거 출력 해석
-module (basic_gen_server). -export ([시작/1, 통화/2, 캐스트/2]). 나는 다음과 같은 디버그 출력을 얻을
MyServer = basic_gen_server:start(name_server).
: 다음 명령을 실행하여 서버를 초기화하는시
% Written by Caleb Helbling
% Last updated Oct 10, 2014
-module(name_server).
-export([init/0, add/3, whereis/2, handle_cast/2,
handle_call/3, handle_swap_code/1]).
%% client routines
add(ServerPid, Person, Place) ->
basic_gen_server:cast(ServerPid, {add, Person, Place}).
whereis(ServerPid, Person) ->
basic_gen_server:call(ServerPid, {whereis, Person}).
%% callback routines
init() ->
maps:new().
handle_cast({add, Person, Place}, State) ->
NewState = maps:put(Person, Place, State),
{noreply, NewState}.
handle_call({whereis, Person}, _From, State) ->
Reply = case maps:find(Person, State) of
{ok, Place} -> Place;
error -> error
end,
NewState = State,
{reply, Reply, NewState}.
handle_swap_code(State) ->
{ok, State}.
: 여기
start(Module) ->
register(server, spawn(basic_gen_server,gen_server_loop,[Module, Module:init()])), server.
call(Pid,Request) ->
Pid ! {call, self(), Request},
receive
Reply -> Reply
end.
cast(Pid,Request) ->
Pid ! {cast, self(), Request},
receive
_ -> ok
end.
gen_server_loop(Module, CurrentState) ->
io:fwrite("gen_server_loop~n", []),
receive
{call, CallPid, Request} ->
{reply, Reply, NewState} = Module:handle_call(Request,self(),CurrentState),
CallPid ! Reply,
gen_server_loop(Module, NewState);
{cast, CastPid, Request} ->
{noReply, NewState} = Module:handle_cast(Request, CurrentState),
CastPid ! noReply,
gen_server_loop(Module, NewState)
end.
그리고
는 정의 된 콜백 모듈=ERROR REPORT==== 29-Oct-2014::12:41:42 ===
Error in process <0.70.0> with exit value: {undef,[{basic_gen_server,gen_server_loop,[name_server,#{}],[]}]}
개념적으로, 직렬 코드를 기본 서버 시스템으로 만드는 개념을 이해하지만 구문 강조 또는 Google을 사용하여 찾을 수 없었던 구문 오류가 있다고 생각합니다. 도움에 미리 감사드립니다!
귀하의 질문과 관련없는 의견 하나는 gen_server 캐스트 인터페이스에서 수신 블록을 제거해야한다고 생각합니다. 캐스트가 동 기화됩니다. 그냥 괜찮아. – Pascal