bat*_*man 1 variables erlang tuples list
有谁擅长调试Erlang?我无法弄清楚我的生活有什么不对.无论我把Fields变量放在哪里,Erlang都说在那行之前有一个错误......
编译消息:
./eventbus.erl:6: syntax error before: FieldPositions
./eventbus.erl:24: variable 'FieldPositions' is unbound
./eventbus.erl:28: Warning: variable 'Ref' is unused
./eventbus.erl:30: Warning: variable 'List' is unused
error
Run Code Online (Sandbox Code Playgroud)
然后是代码本身.
-module(secret).
-export([listen/1, send/1]).
-define(TCP_OPTIONS, [binary, {packet, 0}, {active, false}, {reuseaddr, true}]).
FieldPositions = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","AA","BB","CC","DD","EE","FF","GG","HH","II","JJ","KK","LL","MM","NN","OO","PP"].
listen(Port) ->
{ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
accept(LSocket).
accept(LSocket) ->
{ok, Socket} = gen_tcp:accept(LSocket),
spawn(fun() -> loop(Socket) end),
accept(LSocket).
discrim(<<>>) ->
ok;
discrim([]) ->
ok;
discrim(Info) ->
EventsList = string:tokens(Info,"|"),
process_events(EventsList, FieldPositions).
process_events([],[]) ->
ok;
process_events([],Ref) ->
ok;
process_events(List,[]) ->
ok;
process_events(List,Ref) ->
[RHead|RTail] = Ref,
[Head|Tail] = List,
if
Head == [] ->
process_events(Tail, RTail);
true ->
io:format("message.bus ~s ~s",[RHead,Head]),
process_events(Tail, RTail),
ok
end.
loop(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
%gen_tcp:send(Socket, Data),
%io:format(Data),
discrim(Data),
io:format("~n"),
loop(Socket);
{error, closed} ->
ok
end.
Run Code Online (Sandbox Code Playgroud)
您试图FieldPositions在模块级别声明一个值,这在Erlang中是不允许的.(但您可以在模块级别声明函数,或在函数内声明值.)
有许多替代方案可以达到您想要的效果:
使用-define宏,就像代码中的宏一样TCP_OPTIONS.
内联FieldPositions您想要使用它的值的值.
写一个常量返回函数,如: field_positions() -> ["A","B",...,"PP"].
顺便说一下,根据我对各种编译器和解释器的经验,我建议你不要太过字面上的错误信息.特别是,我认为你应该把你得到的错误视为"错误发生在 x行附近的某个地方 ",而不是字面意思为"在x行之前"或"在x行".