Нашёл способ, с помощью которого можно в Lua писать куски кода через string:
function RUN(_x)
local _test = load("return " .. _x)
return _test()
end
RUN("print('test!')")
Теперь могу свой язык сделать в Tic-80, где будет «switch» и можно код ставить на паузу для диалогов, но не могу придумать, как объявлять переменные через string,
ибо этот код выдаёт ошибку:RUN("local x = 5")
:(
- 24 апреля 2021, 16:58
- 03
Почему-то на гамине в коде форматируются слова( и вместо "return".._x мы получаем какую-то другую скобку и одну точку вместо двух(
PS или я может что-то не так делаю...
а теперь норм, что очень странно, может при копировании с Notepad++ ещё и формат копируется?
Попытался вручную весь код написать, и опять форматируется, тогда такой вариант:
Получается так: если написать этот код в посте, то символы форматируются, а если в комменте этот код ввести, то символы останутся не тронутыми.
Типограф барахлит, вроде поправил.
Спасибо! :3
Реализация в годо несколько легче, потому что есть парсер
Пост на реддите
Жаль что пока нет времени на годот, помимо юнити и GMS, да и ещё Tic-80) но звучит прикольно.
Ну или хотя бы мне бы найти побольше разных примеров с load оператором, а то в сети, в документации lua, не нашёл других примеров, кроме что-то типа
load("return 1+2");
например можно ли как-то без return запустить оператор load? ну и куда важнее, как сделать изменение переменной через load?
оно походу функцию возвращает только, можно попробовать сделать функцию, которая бы возвращала и создавала переменные, хранимые где-то в таблице, и ее уже через строку вызывать
или попробовать локальные внутри функции объявить
максимум что я придумал это создать функцию SetValue и тоже таблицу массивов, например:
и потом запускать так:
PS Но я пока не тестировал, оно может и не работать. И самое плохое, что переменные ограничены этой таблицей, если например я захочу просто подвинуть ось X у объекта, то придётся изобретать что-то посложнее, чем содержание всех переменных в одной таблице.
Но хотя для перемещения объекта можно придумать тоже функцию типа:
То есть для всех переменных вне таблицы, придётся делать дополнительные функции.
И запуск:
RUN("MoveIt(1,0)")
Протестировал, этот код вполне работает на Lua 5.3, который есть в Tic-80 и в плагине LuaScript для Notepad++, я обычно тестирую в Notepad++ простые Lua скрипты.
У меня нет возможности протестировать Pico-8, но наверное там тоже не меньше версия.
да просто типа такого
vars = {}
function SetValue(name, value)
vars[name] = value
end
function GetValue(name)
if vars[name] then return vars[name] end --если есть в таблице то возращаем значение
return nil --если нет то возвращаем nil
end
В целом, работает, только я nil заменил на 0, иначе компилятор выдаёт ошибку, а с нулём норм.
Log Output:
WORK!6
Check: 0
Ещё бы придумать как сократить жутко длинное GetValue('HeroHP'),
на что-то типа GV.HeroHP, но я наверное много прошу)
PS Но вот кстати такая строка работает:
print(">>> "..V.HeroHP)
но жаль если ошибиться, то компилятор выдаст ошибку, например у меня нет в таблице "Wrong"
print(">>> "..V.Wrong)
в прицнипе смотри можно записать в таблицу подтаблицу героя, что было типа vars["hero"] = {health, speed, etc}, потом кэшировать эту подтаблицу героя в переменную, local hero = GetValue("hero"), и уже оттуда обращатся к переменным, hero.health = 100, если уж совсем надо)
Это было так просто.
Я нашёл решение, просто убрав лишнее из кода, точнее "return "...
Теперь можно и инициировать переменные прямо в коде и делать разные математические вещи с переменными.
Ещё добавил функцию с математическими действиями, и вроде ещё лучше стало:
А вообще можно получить ссылку на переменную? То есть не то чему переменная равна, а как-то получить саму ссылку на неё. В таком случае можно было бы и в RUN инициировать эти самые переменные.
Но может это нереально для Lua.
в случае со значениями из таблицы будут ссылки, если ничего не путаю, про переменные не знаю
Нашёл более идеальный метод, с переменной _G, которая содержит вроде бы все глобальные значения:
Финальная версия кода, теперь работает почти в любом месте любого скрипта или части скрипта,
вдруг кому пригодится. Код, для Hello World (нового проекта по умолчанию) на Tic-80:
Сделал рабочую версию:
https://tic80.com/play?cart=1819