[Erlang] Как запускать программы с помощью erl ?
От: Palmovod  
Дата: 09.02.10 07:08
Оценка:
Изучаю Erlang. Пока запускаю программы примеры из оболочки, т.е. сначала запускаю erl а уже из него компилирую и выполняю нужные функции. Как сделать запуск программы неинтерактивно, т.е. с помощью erl имя_программы? В документации написано что надо erl -run Mod [Func [Arg1, Arg2, ...]] параметры модуль, функция и аргументы естественно заменяю но у меня выдает ошибку, хотя в оболочке все запускается нормально.
erlang
Re: [Erlang] Как запускать программы с помощью erl ?
От: Курилка Россия http://kirya.narod.ru/
Дата: 09.02.10 07:35
Оценка:
Здравствуйте, 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 ?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 09.02.10 09:53
Оценка:
Здравствуйте, Palmovod, Вы писали:

P>Изучаю Erlang. Пока запускаю программы примеры из оболочки, т.е. сначала запускаю erl а уже из него компилирую и выполняю нужные функции. Как сделать запуск программы неинтерактивно, т.е. с помощью erl имя_программы? В документации написано что надо erl -run Mod [Func [Arg1, Arg2, ...]] параметры модуль, функция и аргументы естественно заменяю но у меня выдает ошибку, хотя в оболочке все запускается нормально.


-run передаёт аргументы как строки. если ты хочешь видеть их чем-то иным (числа, атомы, etc.) — нужно конвертировать вручную в вызываемой функции.

и вообще, когда говоришь "выдаёт ошибку", надо детально рассказывать, какая ошибка. см. "Как правильно задавать вопросы" в форме постинга
The God is real, unless declared integer.
Re[2]: [Erlang] Как запускать программы с помощью erl ?
От: Palmovod  
Дата: 09.02.10 10:21
Оценка:
Здравствуйте, 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 в принимающей функции преобразовать именно в число чтобы можно было вызывать ее из шелла?
erlang
Re[2]: [Erlang] Как запускать программы с помощью erl ?
От: Palmovod  
Дата: 09.02.10 10:29
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Если хочешь запускать "сервисы", то посмотри бут-скрипты. Просто вызвать функцию "разово" можно, например, так:


К>

К>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"

И дальше висит, приходится снимать вручную.
erlang
Re[3]: [Erlang] Как запускать программы с помощью erl ?
От: Курилка Россия http://kirya.narod.ru/
Дата: 09.02.10 10:43
Оценка:
Здравствуйте, 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>И дальше висит, приходится снимать вручную.


Покажи более полный трейс из терминалаб у меня:

qrilka@qrilka-desktop:~$ erl -noshell -eval 'io:format("~w~n", [erlang:now()])' -s erlang halt
{1265,712105,671802}
qrilka@qrilka-desktop:~$

Re[4]: [Erlang] Как запускать программы с помощью erl ?
От: Palmovod  
Дата: 09.02.10 11:15
Оценка:
К>Покажи более полный трейс из терминалаб у меня:
К>

К>qrilka@qrilka-desktop:~$ erl -noshell -eval 'io:format("~w~n", [erlang:now()])' -s erlang halt
К>{1265,712105,671802}
К>qrilka@qrilka-desktop:~$


Выше я привел весь вывод.
Re[5]: [Erlang] Как запускать программы с помощью erl ?
От: Курилка Россия http://kirya.narod.ru/
Дата: 09.02.10 11:36
Оценка:
Здравствуйте, Palmovod, Вы писали:

P>Выше я привел весь вывод.


Ну если не хочешь строку запуска даже показать, то у нас вроде свободная страна — как будет угодно.
Re[3]: [Erlang] Как запускать программы с помощью erl ?
От: Курилка Россия http://kirya.narod.ru/
Дата: 09.02.10 11:40
Оценка:
Здравствуйте, 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  
Дата: 09.02.10 11:54
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, 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  
Дата: 09.02.10 11:56
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, 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 ?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 09.02.10 12:15
Оценка:
Здравствуйте, 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 ?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 09.02.10 12:17
Оценка:
Здравствуйте, Курилка, Вы писали:

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 ?
От: Курилка Россия http://kirya.narod.ru/
Дата: 09.02.10 12:21
Оценка: 1 (1)
Здравствуйте, Palmovod, Вы писали:

[cut]

Про 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).


Естественно для строк вычитание не работает. Ну и вызов не даст вывода на экран. Вот мой вариант вывода твоего факториала:

qrilka@qrilka-desktop:/var/cipvizion$ erl -noshell -eval 'io:format("~w~n", [learn:fact(10)])' -s erlang halt
3628800
qrilka@qrilka-desktop:/var/cipvizion$


Или см. escript, там пример как раз факториал.
Re[5]: [Erlang] Как запускать программы с помощью erl ?
От: Курилка Россия http://kirya.narod.ru/
Дата: 09.02.10 12:24
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, Курилка, Вы писали:


К>>Посмотри выше — у тебя оно ругается не на вызов fact(10), а на арифметику в fact(1), видимо fact(10) уже был вызван. Не помешало бы кусок кода показать


N>Ты неправ: 1 здесь — количество аргументов функции.

N>Если бы оно говорило про аргумент 1, написало бы {learn, fact, [1]} (в некоторых случаях, особенно при печати через SASL, именно так пишет)

Дак я написал, а потом понял, что фигню написал
Re[5]: [Erlang] Как запускать программы с помощью erl ?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 09.02.10 12:31
Оценка:
Здравствуйте, Palmovod, Вы писали:

P>Вот код:



P>-module(learn).

P>-export([fact/1]).

P>fact(N) when N==0 ->

P> 1;
P>fact(N) when N>0 ->
P> N*fact(N-1).


К слову, это плохой, негодный факториал — он не является хвосто-рекурсивным.

Правильно было бы так:

fact(N) when is_integer(N) andalso N >= 0 ->
    fact(1, N).

fact(Already, 0) ->
    Already;
fact(Already, 1) ->
    Already;
fact(Already, N) when is_integer(N) andalso N >= 2 ->
    fact(N * Already, N - 1).


И, наконец, внешняя функция для вызова через -run:

fact([NL]) when is_string(NL) ->
    fact(list_to_integer(NL)).


(если в том же модуле, то к первой fact/1 прицепить её через ';')
The God is real, unless declared integer.
Re[4]: [Erlang] Как запускать программы с помощью erl ?
От: Palmovod  
Дата: 10.02.10 05:32
Оценка:
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 ()

Хотя должен запускаться как написано вот здесь
Re[5]: [Erlang] Как запускать программы с помощью erl ?
От: Курилка Россия http://kirya.narod.ru/
Дата: 10.02.10 06:05
Оценка:
Здравствуйте, Palmovod, Вы писали:


P>То ли лыжи не едут, то ли я ... Вот написал такой код (не будем говорить о том что здесь нет хвостовой рекурсии):



P>
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)).


Надеюсь видишь разницу? Какой смысл конвертировать целое с помощью функции конвертации списка в целое?
Re[6]: [Erlang] Как запускать программы с помощью erl ?
От: Palmovod  
Дата: 10.02.10 06:50
Оценка:
P>>
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 ?
От: Palmovod  
Дата: 10.02.10 07:12
Оценка:
Даже вот такой пример (взят из faq на сайте erlang вместе с примером запуска) у меня не запускается:

-module(hello).
-export([hello_world/0]).

hello_world() ->
io:fwrite("hello, world\n").

компилируется нормально, запускаю так (флаг -s интерпретирует все аргументы как атомы):

erl -noshell -s hello hello_world -s init stop
{"init terminating in do_boot",{undef,[{hello,hello_world,[]},{init,start_it,1},{init,start_em,1}]}}

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

Начинаю подозревать что может дело в путях к скомпилированному файлу?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.