如果erlang程序中的语句错误

时间:2014-11-02 23:19:34

标签: erlang

我是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," ").

1 个答案:

答案 0 :(得分:2)

您似乎无法在and个保护声明中使用if

您可以尝试使用andalso之类的

I == 2 andalso H == "+" -> calc(T,1,R+H," ");

将编译。

有些惯例不赞成使用if来支持case或函数子句。由于你有这个andcase有点不合适(以后的工作和丑陋的例子)。所以让我们尝试一下函数子句:

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