Я пытаюсь передать контекст в динамическое выражение, которое я оцениваю на каждой итерации цикла for. Я понимаю, что строка загрузки оценивается только в глобальном контексте, что означает, что локальные переменные недоступны. В моем случае я обхожу это ограничение, преобразовывая локальное в глобальное для оценки строки. Вот что у меня есть:
require 'cosmo'
model = { { player = "Cliff", age = 35, gender = "male" }, { player = "Ally", age = 36, gender = "female" }, { player = "Jasmine", age = 13, gender = "female" }, { player = "Lauren", age = 6.5, gender = "female" } }
values = { eval = function(args)
output = ''
condition = assert(loadstring('return ' .. args.condition))
for _, it in ipairs(model) do
each = it
if condition() then
output = output .. each.player .. ' age: ' .. each.age .. ' ' .. '\n'
end
end
return output
end }
template = "$eval{ condition = 'each.age < 30' }"
result = cosmo.fill(template, values)
print (result)
Моя конечная цель (кроме освоения Lua) состоит в том, чтобы создать XSLT-подобный соблазнительный движок, где я мог бы сделать что-то вроде:
apply_templates{ match = each.age > 30}[[<parent-player>$each.player</parent-player>]]
apply_templates{ match = each.age > 30}[[<child-player>$each.player</child-player>]]
... И генерировать разные выходы. В настоящее время я застрял в своих вышеупомянутых ястребиных способах делиться локальным контекстом через глобальный. У кого-нибудь здесь есть лучшее понимание того, как я буду делать то, что пытаюсь сделать?