我是erlang的新手,在学习期间,我试图测试为Reverse Polish Notation Calculator编写的代码。我将测试功能保留在测试文件中,然后使用命令“ eunit:test(calc1,[verbose)]”,我得到了错误。
但是,如果我将源代码和测试功能保存在同一个模块中……一切运行正常……。请帮助我了解该错误以及如何解决该错误。
如果我做错了任何事情,可能会纠正我。
RPN calc的源代码模块:
-module(calc1).
-export([calc/1]).
calc(L) when is_list(L) ->
[Result] = lists:foldl(fun calc/2, [], string:tokens(L," ")),
Result.
calc("+", [N1,N2|Stack]) -> [N2+N1|Stack];
calc("-", [N1,N2|Stack]) -> [N2-N1|Stack];
calc("*", [N1,N2|Stack]) -> [N2*N1|Stack];
calc("/", [N1,N2|Stack]) -> [N2/N1|Stack];
calc("^", [N1,N2|Stack]) -> [math:pow(N2,N1)|Stack];
calc("ln", [N|Stack]) -> [math:log(N)|Stack];
calc("log10", [N|Stack]) -> [math:log10(N)|Stack];
calc("sum", Stack) -> [lists:sum(Stack)];
calc("prod", Stack) -> [lists:foldl(fun erlang:'*'/2, 1, Stack)];
calc(X, [Stack]) -> [read(X)|Stack].
%% read(String()) -> Int() | Float()
read(X) ->
case string:to_float(X) of
{error, no_float} -> list_to_integer(X);
{F,_} -> F
end.
测试文件代码:
-module(calc1_tests).
-include_lib("eunit/include/eunit.hrl").
calc_test() ->
87 = calc1:calc("90 3 -").
应该通过测试用例,但出现错误。
10> c(calc1).
{ok,calc1}
11> c(calc1_tests).
{ok,calc1_tests}
12> eunit:test(calc1).
calc1_tests: calc1_test (module 'calc1_tests')...*failed*
in function calc1:calc/2 (calc1.erl, line 22)
called as calc("90",[])
in call from lists:foldl/3 (lists.erl, line 1263)
in call from calc1:calc/1 (calc1.erl, line 19)
in call from calc1_tests:calc_test/0 (calc1_tests.erl, line 6)
in call from eunit_test:'-mf_wrapper/2-fun-0-'/2 (eunit_test.erl, line 273)
in call from eunit_test:run_testfun/1 (eunit_test.erl, line 71)
in call from eunit_proc:run_test/1 (eunit_proc.erl, line 510)
in call from eunit_proc:with_timeout/3 (eunit_proc.erl, line 335)
**error:function_clause
output:<<"">>
答案 0 :(得分:1)
此函数子句错误:
calc(X, [Stack]) -> [read(X)|Stack].
您正在尝试匹配包含单个项目的列表,但是到RPN末尾时,您实际上已经有一个空列表(堆栈)。可能应该是calc(X, Stack) -> ...