Как определить неинициализированные переменные в скрипте Lua, не запуская его - PullRequest
0 голосов
/ 17 декабря 2018

Я хотел бы иметь возможность написать некоторый код Lua следующим образом:

y=x+1

и иметь возможность получить имена всех переменных (x и y в этом случае), такчто я могу читать / писать им в вызывающей программе C ++.Проблема в том, что x не инициализирован, поэтому этот чанк не будет выполнен, и поэтому ни одна из переменных не появится в таблице глобальных переменных.Мой текущий обходной путь состоит в том, чтобы пользователь явно объявил, что он хочет инициализировать x извне (а также как , чтобы инициализировать его), затем я предварительно ожидаю сценарий Lua с соответствующим объявлением дляx, чтобы окончательный сценарий выглядел следующим образом:

x= /*some value calculated outside of the Lua script*/
y=x+1

Хотя это работает, мне бы очень хотелось иметь способ автоматического перечисления всех неинициализированных переменных в коде Lua и представления их впользователь, а не пользователь должен помнить, чтобы явно объявить их.Функция, которая анализирует код Lua без его выполнения, вероятно, будет тем, что я хочу.Я попробовал функцию luaL_loadstring, но x и y не отображаются в таблице глобальных значений.

Поскольку это немного расплывчато, я приведу реальный пример использования.Мой код C ++ в основном выполняет оптимизацию функций, таких как поиск корня или максимума.Я хочу, чтобы пользователь мог определять пользовательские функции (в форме сценариев Lua), которые в общем случае будут иметь один или несколько входов и один или несколько выходов.Пользователь определяет, с какими параметрами должен работать оптимизатор.Например, пользователь может захотеть найти минимум y=x^2.Я хотел бы, чтобы это работало так: пользователь пишет скрипт Lua, состоящий не более чем из y=x^2, а затем сообщает оптимизатору, что нужно изменить x, чтобы минимизировать y.На каждой итерации оптимизатора текущее предположение для x будет автоматически вставляться в пользовательский сценарий, который затем выполняется, а затем значение y извлекается из состояния Lua для обратной передачи оптимизатору.Вот как у меня это работает сейчас, однако это немного неуклюже с точки зрения UX, потому что пользователь должен вручную объявить, что x является переменной Lua.Это становится утомительным, когда есть много переменных, которые требуют ручного объявления.Было бы намного лучше, если бы я мог автоматически сканировать сценарий и показывать пользователю список их необъявленных переменных, чтобы они могли затем использовать перетаскивание и другой сахар графического интерфейса для выполнения ручного объявления.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вам нужен статический анализатор кода / Lua linter.Взгляните на Luacheck :

Luacheck - статический анализатор и линтер для Lua.Luacheck обнаруживает различные проблемы, такие как использование неопределенных глобальных переменных, неиспользуемых переменных и значений, доступ к неинициализированным переменным, недоступный код и многое другое.Большинство аспектов проверки являются настраиваемыми: существуют параметры для определения пользовательских глобальных параметров, связанных с проектом, для выбора набора стандартных глобальных переменных (версия стандартной библиотеки Lua), для фильтрации предупреждений по типу и имени связанных переменных и т. Д. Можно использовать эти параметры.в командной строке введите в конфигурацию или непосредственно в проверенные файлы, как комментарии Lua.

Существует также Lualint и аналогичные линтеры Lua для Atom , VSCode или ваш любимый IDE.

0 голосов
/ 17 декабря 2018

Луа не предназначен для такой работы.Взаимодействие Lua / C предназначено для сотрудничества ;не должно быть так, что C может делать все, что захочет.

Используя ваш пример, если у вас есть скрипт Lua, который должен принимать значение из C и возвращать это значение + 1, тогда вы пишете это вLua вот так:

local x = ... --Get the first parameter to the chunk.
return x + 1  --Adds 1 to the value and returns it.

Вы компилируете эту строку в кусок Lua и вызываете ее как функцию Lua.Вы передаете ему значение, которым хотите манипулировать, и получаете возвращаемое значение из стека Lua.

Идея , а не в том, что код C может просто проникнуть в скрипт Lua и вставить в него данныепроизвольно.Приведенный выше блок получает параметры от пользователя и предоставляет возвращаемые значения пользователю.Это типично, как С взаимодействует с Lua.

Да, вы можете записывать значения в глобальные переменные, и скрипт Lua может их читать, а также записывать свои «результаты» в глобальные переменные, которые читает внешний код.Но это не самый эффективный способ взаимодействия со скриптами.

Мне бы очень хотелось, чтобы у меня был способ автоматически перечислять все неинициализированные переменные

Этого нетв Lua как «неинициализированная переменная».Не так, как вы имеете в виду.

Да, есть глобалы.Но имеет ли значение глобальное значение , а не , что-то, что может контролировать скрипт Lua.В конце концов, глобальный глобальный ;Вы можете установить глобальную переменную из вне скрипта (например, см. lua_setglobal).Если вы это сделаете, то скрипт, который читает из него, будет читать значение, которое вы установили.Но ничего об этом не знает.

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