Есть ли способ определить функцию Erlang из оболочки Erlang вместо файла erl?
Определение функций erlang в оболочке
Ответ 1
Да, но это больно. Ниже приводится "объявление лямбда-функции" (aka fun
в терминах Erlang).
1
>
F = fun (X) → X + 2 конец.
#Fun <erl_eval.6.13229925>
Посмотрите на post. Вы даже можете ввести значение ценности модуля, если вам когда-либо понадобится. Другими словами, да, вы можете объявлять функции.
Ответ 2
Один ответ заключается в том, что оболочка только оценивает выражения, а определения функций не являются выражениями, они являются формами. В файле erl вы определяете формы, а не выражения.
Все функции существуют внутри модулей, и помимо определений функций модуль состоит из атрибутов, тем важнее имя модулей и какие функции экспортируются из него. Из других модулей можно вызывать только экспортируемые функции. Это означает, что модуль должен быть определен, прежде чем вы сможете определить функции.
Модули являются единицей компиляции в erlang. Они также являются базовым элементом для обработки кода, т.е. Это целые модули, которые загружаются, обновляются или удаляются из системы. В этом отношении определяющие функции отдельно друг от друга не вписываются в схему вещей.
Кроме того, с чисто практической точки зрения, компиляция модуля происходит настолько быстро, что очень мало возможностей в определении функций в оболочке.
Ответ 3
Если вы хотите определить функцию в оболочке, чтобы использовать ее в качестве макроса (поскольку она содержит некоторые функции, которые вам часто нужны), взгляните на
Ответ 4
Это зависит от того, что вам действительно нужно сделать.
Существуют функции, которые можно рассматривать как "одноразовые", то есть они определены один раз для выполнения теста, а затем вы продолжаете. В таких случаях используется синтаксис fun
. Хотя это немного громоздко, это может быть использовано, чтобы выразить вещи быстро и эффективно. Например:
1> Sum = fun(X, Y) -> X + Y end.
#Fun<erl_eval.12.128620087>
2> Sum(1, 2).
3
определяет аноним fun
, который привязан к переменной (или метке) Sum
. Между тем, следующее определяет имя с именем fun
, называемое F
, которое используется для создания нового процесса, чей PID (<0.80.0>
) связан с Pid
. Обратите внимание, что F
вызывается хвостовым рекурсивным способом во втором разделе receive
, позволяя процессу зацикливаться до тех пор, пока ему не будет отправлено сообщение stop
.
3> Pid = spawn(fun F() -> receive stop -> io:format("Stopped~n"); Msg -> io:format("Got: ~p~n", [Msg]), F() end end).
<0.80.0>
4> Pid ! hello.
hello
Got: hello
5> Pid ! stop.
Stopped
stop
6>
Однако вам может потребоваться определить некоторые служебные функции, которые вы собираетесь использовать снова и снова в оболочке Erlang. В этом случае я бы предложил использовать файл user_default.erl
вместе с .erlang
для автоматической загрузки этих пользовательских служебных функций в оболочку Erlang, как только это будет запущено. Например, вы можете написать функцию, которая компилирует все файлы Erlang, находящиеся в текущем каталоге.
Я написал небольшое руководство о том, как это сделать, по этой ссылке на GitHub. Вы можете найти это полезным и поучительным.