Программы должны быть записаны, чтобы люди читали, и только случайно, чтобы машины выполнились.
- от "Структуры и Интерпретации Компьютерных программ" Abelson и Sussman
Это правильно, что вам нужно экспортировать 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()
-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"
Соответствие шаблону - это идиома, которую следует использовать:
-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},
{..., ...},
...]
Затем вы можете по существу привязать события к функциям. (разумеется, здесь есть кое-что еще.
Другой способ взглянуть на это - то, что (в зависимости от решаемой проблемы) динамические вызовы функций не обязательно являются правильным подходом. Учитывая, что процессы и передача сообщений - это способ организации кода в Erlang, поскольку это «язык, ориентированный на параллелизм», возможно, вы могли бы просто использовать передачу сообщений с выборочным приемом, а не имитировать идиомы последовательного языка? Отправьте сообщение о том, что вы хотите, и получите индивидуальный ответ на основе этого. В конце концов, речь идет о результате каждой функции, а не о самой функции. (Плюс гибкость и масштабируемость передачи сообщений и т. Д.)
Хотя процессы не полностью бесплатны по сравнению с вызовом из библиотечного модуля, Процессы уровня Erlang очень дешевы (особенно, если обмен сообщениями осуществляется внутри одного узла). Это не процессы уровня ОС. Накладные расходы были бы сопоставимы (или лучше) с вызовами динамических функций и созданием экземпляров объектов в более тяжелых языках сценариев.