В Erlang, как Вы вызываете функцию динамично?

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

- от "Структуры и Интерпретации Компьютерных программ" Abelson и Sussman

13
задан ottodidakt 21 August 2009 в 06:58
поделиться

4 ответа

Это правильно, что вам нужно экспортировать p и g. Затем для его вызова вы можете использовать apply / 3.

erlang:apply(sample, p, [])

С синтаксисом Fun (...) можно использовать только fun-values. Вы передаете значение атома. В сообщении об ошибке атом - это «плохая функция». Вы можете сделать что-то похожее на

xyz(p) -> fun p/0;
xyz(g) -> fun g/0.

. Затем позвоните по номеру

Fun = xyz(p),
Fun()
23
ответ дан 1 December 2019 в 19:02
поделиться
-module(sample).
-export([xyz/1, p/0, g/0]).

xyz(Name) -> ?MODULE:Name().

p() -> "you called p".
g() -> "you called g".


1> sample:xyz(p).
"you called p"
8
ответ дан 1 December 2019 в 19:02
поделиться

Соответствие шаблону - это идиома, которую следует использовать:

-module(sample).
-export([xyz/1]).

xyz(p) -> p();
xyz(q) -> g().

p() -> "you called p".
g() -> "you called g".

Если вы хотите быть динамическим, вы можете использовать сервер gen_event .

По сути, это сервер который содержит состояние, состоящее из пары ключ / функция, например:

[{p, #func1},
 {g, #func2},
 {..., ...},
 ...]

Затем вы можете по существу привязать события к функциям. (разумеется, здесь есть кое-что еще.

7
ответ дан 1 December 2019 в 19:02
поделиться

Другой способ взглянуть на это - то, что (в зависимости от решаемой проблемы) динамические вызовы функций не обязательно являются правильным подходом. Учитывая, что процессы и передача сообщений - это способ организации кода в Erlang, поскольку это «язык, ориентированный на параллелизм», возможно, вы могли бы просто использовать передачу сообщений с выборочным приемом, а не имитировать идиомы последовательного языка? Отправьте сообщение о том, что вы хотите, и получите индивидуальный ответ на основе этого. В конце концов, речь идет о результате каждой функции, а не о самой функции. (Плюс гибкость и масштабируемость передачи сообщений и т. Д.)

Хотя процессы не полностью бесплатны по сравнению с вызовом из библиотечного модуля, Процессы уровня Erlang очень дешевы (особенно, если обмен сообщениями осуществляется внутри одного узла). Это не процессы уровня ОС. Накладные расходы были бы сопоставимы (или лучше) с вызовами динамических функций и созданием экземпляров объектов в более тяжелых языках сценариев.

0
ответ дан 1 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: