Ubuntu 在本机模式下运行erlang代码

Ubuntu 在本机模式下运行erlang代码,ubuntu,erlang,erlang-shell,Ubuntu,Erlang,Erlang Shell,我无法在本机模式下运行以下代码。尝试时会显示错误消息: 警告:此系统未配置为进行本机代码编译。 escript:异常错误:没有匹配的函数子句 测试描述_1383_893414_479613:主([])(/测试,第5行)在 函数escript:run/2(escript.erl,第747行)从 escript:start/1(escript.erl,第277行)在init:start_it/1的调用中 来自init的in调用:start_em/1 如何配置系统以在本机模式下运行 代码: #!/us

我无法在本机模式下运行以下代码。尝试时会显示错误消息:

警告:此系统未配置为进行本机代码编译。 escript:异常错误:没有匹配的函数子句 测试描述_1383_893414_479613:主([])(/测试,第5行)在 函数escript:run/2(escript.erl,第747行)从 escript:start/1(escript.erl,第277行)在init:start_it/1的调用中 来自init的in调用: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]).
#/usr/bin/env描述
-模式(本机)。%%玩得更快
主([NStr])->
N=列表到整数(NStr),
IJ=[{I,J}|I
打印(N,电路板),
计数+1;
求解(N,J,Board,Count)->
F=乐趣(I,Cnt)->
案例获得的数据(I,J)
正确->
输入数据(I,J,false),
Cnt2=求解(N,J+1,[I|Board],Cnt),
输入数据(I,J,true),
Cnt2;
假->Cnt
结束
完,,
列表:foldl(F,Count,list:seq(1,N))。
输入数据(I,J,Bool)->
put({row,I},Bool),
put({add,I+J},Bool),
put({sub,I-J},Bool)。
获取_数据(I,J)->
get({row,I})和get({add,I+J})以及get({sub,I-J})。
打印(N,电路板)->
Frame=“+-”++字符串:副本(“-”,N)++“+”,
io:格式(“~s~n”,[Frame]),
列表:foreach(fun(I)->打印线(N,I)端,板),
io:格式(“~s~n”,[Frame])。
打印线(N,I)->
当X==I->“Q”++S时,F=fun(X,S);
(u,S)->“++S
完,,
行=列表:foldl(F,“,列表:seq(1,N)),
io:format(“| ~s | ~n”,[Line])。

如果您使用的是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)
这与本机编译无关。这只是意味着您使用零参数调用了escript,但它只接受一个参数。您可以通过在
main
函数中添加第二个子句,使其更加方便用户:

main(Args) ->
    io:format("expected one argument, but got ~b~n", [length(Args)]),
    halt(1).

如果您使用的是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)
这与本机编译无关。这只是意味着您使用零参数调用了escript,但它只接受一个参数。您可以通过在
main
函数中添加第二个子句,使其更加方便用户:

main(Args) ->
    io:format("expected one argument, but got ~b~n", [length(Args)]),
    halt(1).

跑得更快就是玩得更快:)跑得更快就是玩得更快:)