Изучаю Erlang. Пока запускаю программы примеры из оболочки, т.е. сначала запускаю erl а уже из него компилирую и выполняю нужные функции. Как сделать запуск программы неинтерактивно, т.е. с помощью erl имя_программы? В документации написано что надо erl -run Mod [Func [Arg1, Arg2, ...]] параметры модуль, функция и аргументы естественно заменяю но у меня выдает ошибку, хотя в оболочке все запускается нормально.
Здравствуйте, Palmovod, Вы писали:
P>Изучаю Erlang. Пока запускаю программы примеры из оболочки, т.е. сначала запускаю erl а уже из него компилирую и выполняю нужные функции. Как сделать запуск программы неинтерактивно, т.е. с помощью erl имя_программы? В документации написано что надо erl -run Mod [Func [Arg1, Arg2, ...]] параметры модуль, функция и аргументы естественно заменяю но у меня выдает ошибку, хотя в оболочке все запускается нормально.
Если хочешь запускать "сервисы", то посмотри бут-скрипты. Просто вызвать функцию "разово" можно, например, так:
erl -noshell -eval 'io:format("~w~n", [erlang:now()])' -s erlang halt
Т.е. здесь выполняется кусок кода, а потом завершается init() (возможно у тебя он не должен завершаться).
Плюс ещё посмотри escript, возможно, будет полезно.
Re: [Erlang] Как запускать программы с помощью erl ?
Здравствуйте, Palmovod, Вы писали:
P>Изучаю Erlang. Пока запускаю программы примеры из оболочки, т.е. сначала запускаю erl а уже из него компилирую и выполняю нужные функции. Как сделать запуск программы неинтерактивно, т.е. с помощью erl имя_программы? В документации написано что надо erl -run Mod [Func [Arg1, Arg2, ...]] параметры модуль, функция и аргументы естественно заменяю но у меня выдает ошибку, хотя в оболочке все запускается нормально.
-run передаёт аргументы как строки. если ты хочешь видеть их чем-то иным (числа, атомы, etc.) — нужно конвертировать вручную в вызываемой функции.
и вообще, когда говоришь "выдаёт ошибку", надо детально рассказывать, какая ошибка. см. "Как правильно задавать вопросы" в форме постинга
The God is real, unless declared integer.
Re[2]: [Erlang] Как запускать программы с помощью erl ?
Здравствуйте, netch80, Вы писали:
N>-run передаёт аргументы как строки. если ты хочешь видеть их чем-то иным (числа, атомы, etc.) — нужно конвертировать вручную в вызываемой функции.
N>и вообще, когда говоришь "выдаёт ошибку", надо детально рассказывать, какая ошибка. см. "Как правильно задавать вопросы" в форме постинга
Ошибка вот такая:
erl -run learn fact 10
{"init terminating in do_boot",{badarith,[{learn,fact,1},{init,start_it,1},{init
,start_em,1}]}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
Функция fact(N) вычисляет факториал.
Т.е. мне надо число (строку) 10 в принимающей функции преобразовать именно в число чтобы можно было вызывать ее из шелла?
Здравствуйте, Курилка, Вы писали:
К>Если хочешь запускать "сервисы", то посмотри бут-скрипты. Просто вызвать функцию "разово" можно, например, так:
К>
К>erl -noshell -eval 'io:format("~w~n", [erlang:now()])' -s erlang halt
Насколько я понял, этот пример возвращает кол-во секунд пройденное с опр.момента времени, с помощью вызова функций модуля io. Само время получаем с помощью erlang:now(). В оболочке работает.
Из шелла не работает, выдает:
(no error logger present) error: "Error in process <0.0.0> with exit value: {fun
ction_clause,[{init,prepare_run_args,[{eval,[<<16 bytes>>,<<16 bytes>>]}]},{init
,map,2},{init,boot,1}]}\n"
Здравствуйте, Palmovod, Вы писали:
P>Насколько я понял, этот пример возвращает кол-во секунд пройденное с опр.момента времени, с помощью вызова функций модуля io. Само время получаем с помощью erlang:now(). В оболочке работает. P>Из шелла не работает, выдает:
P>(no error logger present) error: "Error in process <0.0.0> with exit value: {fun P>ction_clause,[{init,prepare_run_args,[{eval,[<<16 bytes>>,<<16 bytes>>]}]},{init P>,map,2},{init,boot,1}]}\n"
P>И дальше висит, приходится снимать вручную.
Здравствуйте, Palmovod, Вы писали:
P>Ошибка вот такая:
P>erl -run learn fact 10 P>{"init terminating in do_boot",{badarith,[{learn,fact,1},{init,start_it,1},{init P>,start_em,1}]}}
P>Crash dump was written to: erl_crash.dump P>init terminating in do_boot ()
P>Функция fact(N) вычисляет факториал. P>Т.е. мне надо число (строку) 10 в принимающей функции преобразовать именно в число чтобы можно было вызывать ее из шелла?
Посмотри выше — у тебя оно ругается не на вызов fact(10), а на арифметику в fact(1), видимо fact(10) уже был вызван. Не помешало бы кусок кода показать
Re[6]: [Erlang] Как запускать программы с помощью erl ?
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, Palmovod, Вы писали:
P>>Выше я привел весь вывод.
К>Ну если не хочешь строку запуска даже показать, то у нас вроде свободная страна — как будет угодно.
Строка запуска — та которую вы привели, вот целиком:
erl -noshell -eval 'io:format("~w~n", [erlang:now()])' -s erla
ng halt
(no error logger present) error: "Error in process <0.0.0> with exit value: {fun
ction_clause,[{init,prepare_run_args,[{eval,[<<16 bytes>>,<<16 bytes>>]}]},{init
,map,2},{init,boot,1}]}\n"
Re[4]: [Erlang] Как запускать программы с помощью erl ?
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, Palmovod, Вы писали:
P>>Ошибка вот такая:
P>>erl -run learn fact 10 P>>{"init terminating in do_boot",{badarith,[{learn,fact,1},{init,start_it,1},{init P>>,start_em,1}]}}
P>>Crash dump was written to: erl_crash.dump P>>init terminating in do_boot ()
P>>Функция fact(N) вычисляет факториал. P>>Т.е. мне надо число (строку) 10 в принимающей функции преобразовать именно в число чтобы можно было вызывать ее из шелла?
К>Посмотри выше — у тебя оно ругается не на вызов fact(10), а на арифметику в fact(1), видимо fact(10) уже был вызван. Не помешало бы кусок кода показать
Вот код:
-module(learn).
-export([fact/1]).
fact(N) when N==0 ->
1;
fact(N) when N>0 ->
N*fact(N-1).
Re[3]: [Erlang] Как запускать программы с помощью erl ?
Здравствуйте, Palmovod, Вы писали:
N>>-run передаёт аргументы как строки. если ты хочешь видеть их чем-то иным (числа, атомы, etc.) — нужно конвертировать вручную в вызываемой функции.
N>>и вообще, когда говоришь "выдаёт ошибку", надо детально рассказывать, какая ошибка. см. "Как правильно задавать вопросы" в форме постинга
P>Ошибка вот такая:
P>erl -run learn fact 10 P>{"init terminating in do_boot",{badarith,[{learn,fact,1},{init,start_it,1},{init P>,start_em,1}]}}
P>Crash dump was written to: erl_crash.dump P>init terminating in do_boot ()
P>Функция fact(N) вычисляет факториал. P>Т.е. мне надо число (строку) 10 в принимающей функции преобразовать именно в число чтобы можно было вызывать ее из шелла?
Да, именно так.
The God is real, unless declared integer.
Re[4]: [Erlang] Как запускать программы с помощью erl ?
Здравствуйте, Курилка, Вы писали:
P>>erl -run learn fact 10 P>>{"init terminating in do_boot",{badarith,[{learn,fact,1},{init,start_it,1},{init P>>,start_em,1}]}}
P>>Crash dump was written to: erl_crash.dump P>>init terminating in do_boot ()
P>>Функция fact(N) вычисляет факториал. P>>Т.е. мне надо число (строку) 10 в принимающей функции преобразовать именно в число чтобы можно было вызывать ее из шелла?
К>Посмотри выше — у тебя оно ругается не на вызов fact(10), а на арифметику в fact(1), видимо fact(10) уже был вызван. Не помешало бы кусок кода показать :shuffle:
Ты неправ: 1 здесь — количество аргументов функции.
Если бы оно говорило про аргумент 1, написало бы {learn, fact, [1]} (в некоторых случаях, особенно при печати через SASL, именно так пишет)
The God is real, unless declared integer.
Re[5]: [Erlang] Как запускать программы с помощью erl ?
Про fact(1) я прогнал, это арность функции, т.е. fact/1, а проблема в параметрах, читаем доки:
-run Mod [Func [Arg1, Arg2, ...]](init flag)
Makes init call the specified function. Func defaults to start. If no arguments are provided, the function is assumed to be of arity 0. Otherwise it is assumed to be of arity 1, taking the list [Arg1,Arg2,...] as argument. All arguments are passed as strings. See init(3).
Естественно для строк вычитание не работает. Ну и вызов не даст вывода на экран. Вот мой вариант вывода твоего факториала:
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, Курилка, Вы писали:
К>>Посмотри выше — у тебя оно ругается не на вызов fact(10), а на арифметику в fact(1), видимо fact(10) уже был вызван. Не помешало бы кусок кода показать
N>Ты неправ: 1 здесь — количество аргументов функции. N>Если бы оно говорило про аргумент 1, написало бы {learn, fact, [1]} (в некоторых случаях, особенно при печати через SASL, именно так пишет)
Дак я написал, а потом понял, что фигню написал
Re[5]: [Erlang] Как запускать программы с помощью erl ?
P>>Ошибка вот такая:
P>>erl -run learn fact 10 P>>{"init terminating in do_boot",{badarith,[{learn,fact,1},{init,start_it,1},{init P>>,start_em,1}]}}
P>>Crash dump was written to: erl_crash.dump P>>init terminating in do_boot ()
P>>Функция fact(N) вычисляет факториал. P>>Т.е. мне надо число (строку) 10 в принимающей функции преобразовать именно в число чтобы можно было вызывать ее из шелла?
N>Да, именно так.
То ли лыжи не едут, то ли я ... Вот написал такой код (не будем говорить о том что здесь нет хвостовой рекурсии):
-module(learn1).
-export([fac/1]).
fac(N) when is_integer(N) ->
fact(list_to_integer(N)).
fact(N) when N==0 ->
1;
fact(N) when N>0 ->
N*fact(N-1).
Он как и положено проверяет что аргумент это целое число и передает его другой функции. Но не работает из шелла:
erl -run learn1 fac 10
{"init terminating in do_boot",{function_clause,[{learn1,fac,["10"]]},{init,sta
rt_it,1},{init,start_em,1}]}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
P>>fac(N) when is_integer(N) ->
P>> fact(list_to_integer(N)).
P>>
К>Сравни с приведённым рядом
К>
К>fact([NL]) when is_string(NL) ->
К> fact(list_to_integer(NL)).
К>Надеюсь видишь разницу? Какой смысл конвертировать целое с помощью функции конвертации списка в целое?
Переделал, теперь код такой:
-module(learn1).
-export([fac/1]).
fac(N) when is_string(N) ->
fact(list_to_integer(N)).
fact(N) when N==0 ->
1;
fact(N) when N>0 ->
N*fact(N-1).
и при компиляции выдает ошибку:
learn1.erl:4: illegal guard expression
Я изменил fac(N) на fac([N]) но ошибка при компиляции осталась. Непонятно конечно зачем писать [N] но это другой вопрос.
т.е. что то не так с when is_string(N)
Re: [Erlang] Как запускать программы с помощью erl ?