gpt4 book ai didi

Erlang 开头 : moving a function from an escript into OTP

转载 作者:行者123 更新时间:2023-12-03 21:13:22 25 4
gpt4 key购买 nike

'escript' in the Erlang docs 中有一个阶乘函数的简单实现。 .阶乘函数如下:

fac(0) -> 1;
fac(N) -> N * fac(N-1).

没关系,我可以让它工作,没问题。

然而,我想知道如何使用 rebar3 以“OTP 方式”实现同样的简单阶乘函数。 ?

为了清楚起见,我的问题是:
  • 代码去哪儿了?
  • 我如何从外壳调用它?
  • 我也可以像通过 escript 示例那样从命令行运行它吗?

  • 仅供引用,我已经开始使用 rebar3 .这是我所在的位置:
    rebar3 new app factorial

    创建了一些文件,但具体而言,代码位于 src 中的 3 个文件中目录。我可以看到正在使用主管,似乎很好。

    我可以从 shell 与这个项目进行交互:
    $ rebar3 shell

    1> application:which_applications().
    [{factorial,"An OTP application","0.1.0"},
    {inets,"INETS CXC 138 49","7.0.3"},
    {ssl,"Erlang/OTP SSL application","9.1.1"},
    {public_key,"Public key infrastructure","1.6.4"},
    {asn1,"The Erlang ASN1 compiler version 5.0.8","5.0.8"},
    {crypto,"CRYPTO","4.4"},
    {stdlib,"ERTS CXC 138 10","3.7"},
    {kernel,"ERTS CXC 138 10","6.2"}]
    2> application:stop(factorial).
    =INFO REPORT==== 21-Jan-2019::12:42:07.484244 ===
    application: factorial
    exited: stopped
    type: temporary
    ok
    3> application:start(factorial).
    ok

    最佳答案

    代码去哪儿了?

    要“以 OTP 方式调用代码”,您可以将其放在 gen_server 后面。 .

    对于这个简单的阶乘函数,我添加了一个新文件 factorial.erlsrc 内几乎是标准的目录 gen_server以我的阶乘函数作为回调之一的骨架:

    % factorial.erl
    -module(factorial).
    -behaviour(gen_server).
    -export([start_link/0, stop/0, calc/1]).

    <boilerplate gen_server stuff here, like init, etc.>

    calc(N) ->
    {ok, Result} = gen_server:call(?SERVER, {calc, N}),
    {ok, Result}.

    handle_call({calc, N}, _From, State) ->
    Factorial = factorial(N),
    Reply = {ok, Factorial},
    {reply, Reply, State};

    factorial(0) ->
    1;
    factorial(N) ->
    N * factorial(N-1).

    由于我的 rebar3 new app factorial创建了主管,我修改了主管的 init这样它就会调用我的 factorial模块:
    % factorial_sup.erl

    <skeleton supervisor stuff here>

    init([]) ->
    Server = {factorial, {factorial, start_link, []},
    permanent, 2000, worker, [factorial]},
    Children = [Server],
    RestartStrategy = {one_for_one, 0, 1},
    {ok, {RestartStrategy, Children}}.

    我如何从外壳调用它?
    $ rebar3 shell
    <Enter>
    1> factorial:calc(5).
    {ok,120}

    由于这是在主管下运行的,我们仍然可以停止并重新启动它:
    2> application:stop(factorial).
    =INFO REPORT==== 22-Jan-2019::13:31:29.243520 ===
    application: factorial
    exited: stopped
    type: temporary
    ok
    3> factorial:calc(5).
    ** exception exit: {noproc,{gen_server,call,[factorial,{calc,5}]}}
    in function gen_server:call/2 (gen_server.erl, line 215)
    in call from factorial:calc/1 (/Users/robert/git/factorial/src/factorial.erl, line 32)
    4> application:start(factorial).
    ok
    5> factorial:calc(5).
    {ok,120}

    如何创建可执行文件?

    进行中的工作 :-) .

    关于Erlang 开头 : moving a function from an escript into OTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54290276/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com