Отправка и получение сообщений Erlang с помощью нескольких процессов - PullRequest
0 голосов
/ 18 июня 2020

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

{джон, [Джилл, Джо, Боб]}. {Джилл, [боб, Джо, боб]}. {Сью, [Джилл, Джилл, Джилл, Боб, Джилл]}. {Боб, [Джон]}. {joe, [sue]}.

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

invoke(Elem)  ->
  {X,Y} = Elem,
  Pid = spawn(calling, people, [X,Y]),
  register(X,Pid).

второй модуль

people(N,Persons) ->
  lists:foreach(fun contact/1, Persons),
  io:fwrite("in people\n").

Я получаю следующую ошибку:

 =ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.59.0> with exit value:
{undef,[{calling,people,[john,[jill,joe,bob]],[]}]}

=ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.60.0> with exit value:
{undef,[{calling,people,[jill,[bob,joe,bob]],[]}]}

=ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.61.0> with exit value:
{undef,[{calling,people,[sue,[jill,jill,jill,bob,jill]],[]}]}

=ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.62.0> with exit value:
{undef,[{calling,people,[bob,[john]],[]}]}

=ERROR REPORT==== 18-Jun-2020::20:27:49 ===
Error in process <0.63.0> with exit value:
{undef,[{calling,people,[joe,[sue]],[]}]}

1 Ответ

1 голос
/ 19 июня 2020

В сообщении об ошибке сказано, что функция people с 2 аргументами не существует в модуле calling. Для этого есть несколько возможностей:

  1. модуль calling не существует
  2. модуль calling недоступен (не в пути)
  3. модуль calling не компилируется
  4. функция people/2 не экспортируется в модуль calling

Редактировать

Вы можете проверить код пути (список мест, где машина Erlang будет искать модули) с помощью команды rp(code:get_path()).. Если вы не сделали ничего особенного, вы получите список, содержащий "." в качестве первого элемента, а затем все библиотеки erlang. Точка означает рабочий каталог.

С помощью команды pwd(). вы можете получить место этого рабочего каталога.

Затем вы должны найти файл с именем звонящий. луч . Если он не существует, вы должны скомпилировать модуль, например, с помощью команды c(calling). в оболочке.

Если он существует, но находится в другом месте, чем рабочий каталог, вы должны выбрать один из эти решения (я не знаю, какое из них лучше в вашем случае):

  1. добавьте каталог, в котором находится файл луча (необходимо выполнять каждый раз при запуске виртуальной машины Erlang) с помощью команды code:add_path("Path/to/your/beam/file")
  2. Убедитесь, что все нужные вам файлы лучей находятся в одном каталоге, и запустите виртуальную машину из него. В конце концов измените рабочий каталог в нужное место с помощью: cwd("beam/file/directory")..

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

  • application
    • do c -> для всех файлов документации
    • sr c -> для всех исходных файлов (module.erl, application.app.sr c)
    • include -> для всех файлов заголовков (module.hrl)
    • ebin -> для всех скомпилированных файлов (module.beam, application.app)
    • ...

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

...