Определение функций эрланга в оболочке - PullRequest
35 голосов
/ 14 января 2010

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

Ответы [ 4 ]

43 голосов
/ 14 января 2010

Да, но это больно. Ниже приведено «объявление лямбда-функции» (он же fun в терминах Эрланга).

1 > F = веселье (X) -> X + 2 конец.

#Fun <erl_eval.6.13229925>

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

14 голосов
/ 16 января 2010

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

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

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

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

3 голосов
/ 28 февраля 2010

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

http://erldocs.com/R13B04/stdlib/shell_default.html

0 голосов
/ 01 марта 2019

Это зависит от того, что вам действительно нужно сделать.

Существуют функции, которые можно рассматривать как «одноразовые», то есть они определены один раз для выполнения теста, а затем вы продолжаете. В таких случаях используется синтаксис 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 . Вы можете найти это полезным и поучительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...