Courier New для меня также, это хорошо расположено с интервалами.
Я бы посоветовал вам провести рефакторинг, чтобы использовать всю мощь Erlang и его возможностей сопоставления с образцом.
Не существует оператора return
. Кроме того, малоизвестный факт: вы можете сделать что-то вроде:
Return = case ... of
оператор case
может иметь «возвращаемое» значение.
Erlang не имеет оператор возврата
. Вам нужно будет преобразовать ваш код в более мелкие функции.
В исходном коде есть два выражения case, связанных с оператором запятой. Я предполагаю, что у вас есть некоторые побочные эффекты в первом выражении case, которые вы хотите сохранить. Ниже я использую воображаемый оператор return
:
case ... of
P1 -> return E1;
P2 -> E2;
end,
case ... of
...
end
Такое выражение может быть преобразовано в реальный код Erlang с помощью небольших функций и сопоставления с образцом, что-то вроде этого:
case1(P1, ...) -> E1;
case1(P2, ...) -> E2, case2(...).
case2(...) -> ...
Отказ от ответственности: уже 10 лет с тех пор, как я
В Erlang вы просто используете сопоставление с образцом для запуска соответствующей функции. Если у вас слишком много пунктов, которые нужно охватить и разобраться, я бы также предложил немного реорганизовать код.
используйте catch / throw
Вызывающий говорит:
X = (catch foo(A, B)).
затем напишите
foo(A, B) -> case ... of ...throw(X) .. end, case ... of ... throw (Y) end, ...
Это обычно считается плохой практикой программирования, поскольку программа имеет несколько точки выхода, и их трудно найти
Один из способов - каскадировать операторы case:
my_fun(X) ->
case cond1(X) of
true -> ret1;
_ ->
case cond2(X) of
true -> ret2;
_ ->
...
end
end.
Другой - разделить операторы case на предложения:
my_fun(X) ->
my_fun(cond1, X).
my_fun(cond1, X) ->
case cond1(X) of
true -> ret1;
_ -> my_fun(cond2, X)
end;
my_fun(cond2, X) ->
case cond2(X) of
true -> ret2;
_ -> my_fun(cond3, X)
end;
...
Сопоставление с образцом - это хороший способ рефакторинга оператора case - вы можете сделать что-то вроде этого
testcase(1, X, Y) -> .... passed1;
testcase(2, X, Y) -> .... passed2;
testcase(N, X, Y) when N > 2 -> .... passedlarge;
testcase(_, X, Y) -> defaultcase.
, а затем ваш оператор case просто завершится до:
X = testcase(Number, Param1, Param2).
(в этом надуманном примере X будет либо передан1, либо передан2, ни передан, либо по умолчанию)