#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
Однако я бы не рекомендовал это, поскольку это противоречит назначению функций как независимых объектов.