我是erlang的新手,并且很难习惯它。我写了一个简单的函数,我收到一个错误:Error:(21, -1) erlc: syntax error before: '=='
(第21行是:I == 2 and H == "+" -> calc(T,1,R+H," ");
的行)。我不知道导致问题的原因,但是当我删除第21行时,一切正常。这是否与"和#34;有关?我在第21行使用的声明?如何正确使用此声明?
-module(onp).
-author("majew_000").
%% API
-export([]).
-export([onp/1]).
-export([calc/4]).
%I = 0 function just started
%I = 1 function took action sign
%I = 2 action has to be made
%R -> result
%I -> indicator
%A -> sign of an operation (+,-,/,*)
calc([],I,R,A) -> R;
calc([H|T],I,R,A) ->
if
I == 0 -> calc(T,1,R+H," ");
I == 1 -> calc(T,2,R,H);
I == 2 and H == "+" -> calc(T,1,R+H," ");
true -> R
end.
onp([])->[];
onp([H | T])->calc(string:tokens([H|T]," "),0,0," ").
答案 0 :(得分:2)
您似乎无法在and
个保护声明中使用if
。
您可以尝试使用andalso
之类的
I == 2 andalso H == "+" -> calc(T,1,R+H," ");
将编译。
有些惯例不赞成使用if
来支持case
或函数子句。由于你有这个and
,case
有点不合适(以后的工作和丑陋的例子)。所以让我们尝试一下函数子句:
calc([],I,R,A) ->
R;
calc([H|T], 0, R, A) ->
calc(T, 1, R+H, " ");
calc([H|T], 1, R, A) ->
calc(T, 2, R, H);
calc([ $+ |T], 2, R, A) -> %% `$+` stands for + character,
calc(T, 1, R+H, " ");
calc( _, _, _, _) ->
R.
你可以将“魔法数字”改为有意义的原子,并确保正确的起始参数。
calc(List) ->
calc(List, start, _Rest = 0, _Action = " ").
calc([],I,R,A) ->
R;
calc([H|T], start, R, A) ->
calc(T, took_action, R+H, " ");
calc([H|T], took_action, R, A) ->
calc(T, make_action, R, H);
calc([ $+|T], make_action, R, A) -> %% `$+` stands for `+` character,
calc(T, took_action, R+H, " ");
calc( _, _, _, _) ->
R.
然后再扩展你的逻辑
calc(List) ->
calc(List, start, _Rest = 0, _Action = " ").
calc([],I,R,A) ->
R;
calc([H|T], start, R, A) ->
calc(T, took_action, R+H, " ");
calc([H|T], took_action, R, A) ->
calc(T, make_action, R, H);
calc([H|T], make_action, R, A) -> %% `$+` stands for `+` character,
case H of
$+ ->
calc(T, took_action, R+H, " ");
$- ->
calc(T, took_action, R-H, " ");
[ .... ]
end
calc( _, _, _, _) ->
R.
但是在这里你可以看到你开始添加H
这是一个角色(仍然基于你的if
代码)。所以我想,你应该case
采取行动A
,并继续使用H
添加/倍增/ ... R
。