Рекурсия внутренних функций в Эрланге - PullRequest
3 голосов
/ 02 августа 2010

Играя с Эрлангом, у меня есть функция зацикливания процесса, такая как:

process_loop(...A long list of parameters here...) ->
    receive
        ...Message processing logic involving the function parameters...
    end,
    process_loop(...Same long list of parameters...)
end.

Это выглядит довольно уродливо, поэтому я попробовал рефакторинг так:это оказалось неверным, поскольку переменная Loop не связана внутри функции Loop.Итак, я организовал обходной путь:

process_loop(...A long list of parameters...) ->
    Loop = fun(Next) ->
        receive
            ...Message processing logic...
        end,
        Next(Next)
    end,
    Loop(Loop)
end.

У меня есть два вопроса:

  1. Есть ли способ реализовать идею фрагмента № 2, но безтакие обходные пути «Next (Next)»?

  2. Значительно ли отличаются отрывки # 1 и # 3 с точки зрения производительности или они эквивалентны?

Ответы [ 4 ]

2 голосов
/ 02 августа 2010
  1. Нет.К сожалению, анонимная функция - только это.Аноним, если вы не дадите им имя.

  2. Фрагмент №3 немного дороже.Учитывая, что вы делаете сопоставление с образцом в сообщениях в теле, я бы не стал беспокоиться об этом.Оптимизировать для удобочитаемости в этом случае.Разница очень мала постоянный коэффициент.

2 голосов
/ 02 августа 2010
  1. Вы можете использовать кортежи / записи в качестве именованных параметров вместо передачи большого количества параметров.Вы можете просто повторно использовать единственный параметр, который будет принимать функция.

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

0 голосов
/ 04 августа 2010

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

Конечно, вы можете использовать свое решение и иметь некоторые параметры, неявные в забаве, а некоторые явные в рекурсивных вызовах, но яНе думаю, что это улучшит ясность.

Тот же ответ применим к "нормальной" рекурсии, когда вы пересекаете структуры данных.

0 голосов
/ 03 августа 2010

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

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