2010-04-28 2 views
3

Я хочу загрузить данные, написанные в варианте lua (eyeonScript). Тем не менее, данные засыпали со ссылками на инициализацию функции, которые не в простом Lua:Как обрабатывать неизвестные функции инициализации в lua?

Redden = BrightnessContrast { 
    Inputs = { 
     Red = Input { 
      Value = 0, 
     }, 
    }, 
} 

Стандарт Lua дает «попытку назвать нулевую ценность» или ошибки «неожиданный символ». Есть ли способ поймать их и передать их на какой-то общий инициализатор?

Я хочу завершить с помощью структуры данных вложенных таблиц.

Спасибо!

ответ

4

Установить __index метаметод для таблицы глобал. Например, так, что неопределенные функции ведут себя как личность:

setmetatable(_G,{__index=function (n) 
          return function (x) return x end 
         end}) 
+0

Спасибо! Это в значительной степени то, что мне нужно. Небольшой побочный эффект заключается в том, что любые опечатки теперь превращаются в функции, но поскольку я запускаю Lua только для разбора этой структуры, я не слишком беспокоюсь об этом. – oofoe

+0

хороший трюк. @oofoe: все равно вы можете создать настраиваемую среду для выполнения файла конфигурации в (с помощью setfenv), чтобы он не мог сбивать или загрязнять ваше обычное пространство имен. Затем вы можете определить метаметод только в этой среде. – u0b34a0f6ae

2

Вот еще один трюк: установить __call для ноля, но вы должны сделать это в C или с использованием библиотеки отладки. Преимуществом этого трюка является то, что он обрабатывает вызовы только для неопределенных функций:

debug.setmetatable(nil,{__call=function (x,v) return v end}) 
Смежные вопросы