pro*_*490 0 erlang ubuntu erlang-shell
我无法在纯模式下运行以下代码.我尝试时显示错误消息:
警告:此系统未配置为本机代码编译.escript:异常错误:没有函数子句匹配test_ escript _1383_ 893414 _479613:main([])(./ test,第5行)函数escript:run/2(escript.erl,第747行)从escript调用:start/1(escript.erl,第277行)调用init:start_it/1调用init:start_em/1
如何配置我的系统以在纯模式下运行它?
码:
#!/usr/bin/env escript
-mode(native). %% to fun faster
main([NStr]) ->
N = list_to_integer(NStr),
IJ = [{I, J} || I <- lists:seq(1, N), J <- lists:seq(1, N)],
lists:foreach(fun({I, J}) -> put_data(I, J, true) end, IJ),
solve(N, 1, [], 0).
solve(N, J, Board, Count) when N < J ->
print(N, Board),
Count + 1;
solve(N, J, Board, Count) ->
F = fun(I, Cnt) ->
case get_data(I, J) of
true ->
put_data(I, J, false),
Cnt2 = solve(N, J+1, [I|Board], Cnt),
put_data(I, J, true),
Cnt2;
false -> Cnt
end
end,
lists:foldl(F, Count, lists:seq(1, N)).
put_data(I, J, Bool) ->
put({row, I }, Bool),
put({add, I+J}, Bool),
put({sub, I-J}, Bool).
get_data(I, J) ->
get({row, I}) andalso get({add, I+J}) andalso get({sub, I-J}).
print(N, Board) ->
Frame = "+-" ++ string:copies("--", N) ++ "+",
io:format("~s~n", [Frame]),
lists:foreach(fun(I) -> print_line(N, I) end, Board),
io:format("~s~n", [Frame]).
print_line(N, I) ->
F = fun(X, S) when X == I -> "Q " ++ S;
(_, S) -> ". " ++ S
end,
Line = lists:foldl(F, "", lists:seq(1, N)),
io:format("| ~s|~n", [Line]).
Run Code Online (Sandbox Code Playgroud)
如果您正在使用Ubuntu软件包,请安装erlang-base-hipe而不是erlang-base(一个替换另一个).HIPE代表"高性能Erlang".
本机编译不是唯一的编译类型.如果使用-mode(compile),脚本将在运行之前编译为BEAM字节代码.无论您的Erlang安装是否支持HIPE,这都有效,并且在大多数情况下都足够快.
您还会收到第二条错误消息:
escript: exception error: no function clause matching test__escript__1383__893414__479613:main([]) (./test, line 5)
Run Code Online (Sandbox Code Playgroud)
这与本机编译无关.它只是意味着您使用零参数调用escript,但它只接受一个参数.通过向main函数添加第二个子句,可以使用户更友好一些:
main(Args) ->
io:format("expected one argument, but got ~b~n", [length(Args)]),
halt(1).
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |