Erlang开始:将函数从escript移动到OTP

Erlang开始:将函数从escript移动到OTP,erlang,otp,Erlang,Otp,在“escript”中有一个阶乘函数的简单实现。阶乘函数如下所示: fac(0) -> 1; fac(N) -> N * fac(N-1). 没关系,我可以让它工作,没问题 然而,我想知道如何使用rebar3以“OTP方式”实现这个相同的简单阶乘函数 我想澄清一下,我的问题是: 代码在哪里 我怎么称呼它呢 我也可以像通过escript示例那样从命令行运行它吗 仅供参考,我已经开始使用rebar3。以下是我的位置: rebar3 new app factorial 创建一些文件

在“escript”中有一个阶乘函数的简单实现。阶乘函数如下所示:

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\u服务器
后面

对于这个简单的阶乘函数,我在
src
目录中添加了一个新文件
factorial.erl
,它几乎是一个标准的
gen_服务器
框架,我的阶乘函数是回调函数之一:

% 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).
我怎么称呼它呢? 如何创建可执行文件?
正在进行的工作
:-)

为什么您如此关注描述?我试过一次,但是对于我的所有程序,我都使用erlang shell编译和运行我的.erl文件,其中包含我的erlang代码。无论如何,我第一次尝试钢筋是详细的,也许它会帮助你。这不是说我专注于描述,而是因为我已经让他们工作了,所以用这种方式来构建问题是有意义的。来自Python的escript非常有意义:获取参数,将它们传递给一些函数。我在这一点上没有触犯OTP。
% 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}