init, завершающийся в do_boot, вызывается при выполнении скрипта Erlang

Вот мой код в 'factorial.erl':

-module(factorial).
-author("jasonzhu").

%% API
-export([fac/1]).

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

При взаимодействии с этим кодом в подсказке он отлично работает:

1> c(factorial).
{ok,factorial}
2> factorial:fac(20).
2432902008176640000

Но если я скомпилирую и выполню его из командной строки, возникнут некоторые ошибки.

Jasons-MacBook-Pro:src jasonzhu$ erlc factorial.erl 
Jasons-MacBook-Pro:src jasonzhu$ erl -noshell -s factorial fac 20 -s init stop
{"init terminating in do_boot",{badarith,[{factorial,fac,1,[{file,"factorial.erl"},{line,8}]},{init,start_it,1,[]},{init,start_em,1,[]}]}}

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()

Может ли кто-нибудь помочь мне? Я новичок в Erlang, большое спасибо!


person Judking    schedule 07.05.2015    source источник


Ответы (2)


синтаксис -noshell

erl -noshell -s Module Function Arguments

где Аргументы — это список атомов. Итак, вам нужно получить аргумент «fac» из списка и преобразовать его в целое число.

Этот

-module(factorial).

-export([fac/1]).

fac([N]) ->
    X = fac(list_to_integer(atom_to_list(N))),
    io:format("~p~n", [X]);
fac(0) -> 1;
fac(N) -> N * fac(N-1).

работает

>>> erl -noshell -s factorial fac 20 -s init stop
2432902008176640000
person P_A    schedule 07.05.2015

Этот параметр не относится к вопросу ОП, просто может быть полезен для тех, кто пришел из поиска «инициализация завершается в do_boot» в дополнение к официальному документу Как интерпретировать аварийные дампы Erlang

Если ваш код лежит какое-то время и вы снова начинаете с ним работать, перекомпиляция может устранить эту ошибку.

  1. Удалить каталог _build/
  2. Удалить файл rebar.lock
  3. Скомпилировать /dir_with_rebarconfig$ rebar3 release
person Lipstick Slaver    schedule 20.07.2021