Как я могу сделать многоуровневый возврат из функции?

#lua

#lua

Вопрос:

Как я могу вернуть более одного уровня вызывающих абонентов в Lua?

Что-то вроде в Forth, когда вы удаляете одно значение из стека возвратов?

     arrSimpleConv=
          (function(result,base)if not base then return  nil end
  for rec in (function(rst) if not rst then return pairs({}) end
                       rst:Sort{{field=5,descent=true},{field=7},{field=10}}
                return rst.Records end)(base.RecordSet) do
    result[#result 1]= {
                         Type = rec:GetValue(5),
                         LegName = rec:GetValue(10),
                         PickName = rec:GetValue(11),
                         FlagHierarch = tonumber(rec:GetValue(30)),
                         Rules = (function(result,input)
                                for i,p in ipairs(input) do
                                  result[i] = table.unserialize(p)
                                end return result end)({},rec:GetValue(20, 0))
                       }
  end return result end)(arrSimpleConv or {},CroApp.GetBank():GetVocabulary():GetBase("XX"))
 

Комментарии:

1. Пожалуйста, опубликуйте пример.

2. Насколько я знаю, Lua на самом деле не поддерживает композицию функций так, как это делает Forth, поэтому я не думаю, что стек таким образом материализуется .

3. Из опубликованного вами примера все еще неясно levels of callers , что вы хотите вернуть.

Ответ №1:

Функция в Lua (и большинстве языков программирования) представляет собой единую единицу выполнения и не влияет на вызывающий объект, за исключением возвращаемых значений. Использование хвостового вызова — единственный способ прямого перехода к другой функции.

Также можно использовать механизм ошибок для перехода за пределы функции:

 local signal = {}

function a()
  error(signal)
end

local status, err = pcall(a)
if err == signal then
  --"returned" from the specific point inside a function
end
 

Однако я бы не рекомендовал это, поскольку это противоречит назначению функций как независимых объектов.