Подтвердить что ты не робот

Определение функций erlang в оболочке

Есть ли способ определить функцию Erlang из оболочки Erlang вместо файла erl?

4b9b3361

Ответ 1

Да, но это больно. Ниже приводится "объявление лямбда-функции" (aka fun в терминах Erlang).

1 > F = fun (X) → X + 2 конец.

#Fun <erl_eval.6.13229925>

Посмотрите на post. Вы даже можете ввести значение ценности модуля, если вам когда-либо понадобится. Другими словами, да, вы можете объявлять функции.

Ответ 2

Один ответ заключается в том, что оболочка только оценивает выражения, а определения функций не являются выражениями, они являются формами. В файле erl вы определяете формы, а не выражения.

Все функции существуют внутри модулей, и помимо определений функций модуль состоит из атрибутов, тем важнее имя модулей и какие функции экспортируются из него. Из других модулей можно вызывать только экспортируемые функции. Это означает, что модуль должен быть определен, прежде чем вы сможете определить функции.

Модули являются единицей компиляции в erlang. Они также являются базовым элементом для обработки кода, т.е. Это целые модули, которые загружаются, обновляются или удаляются из системы. В этом отношении определяющие функции отдельно друг от друга не вписываются в схему вещей.

Кроме того, с чисто практической точки зрения, компиляция модуля происходит настолько быстро, что очень мало возможностей в определении функций в оболочке.

Ответ 3

Если вы хотите определить функцию в оболочке, чтобы использовать ее в качестве макроса (поскольку она содержит некоторые функции, которые вам часто нужны), взгляните на

https://erldocs.com/current/stdlib/shell_default.html

Ответ 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. Вы можете найти это полезным и поучительным.