Lua: запустить код во время ожидания ввода
В настоящее время я работаю над программой Lua. Я хочу использовать его в Minecraft с модом под названием "OpenComputers", который позволяет использовать сценарии lua в эмулируемых системах. Программа, над которой я работаю, относительно проста: у вас есть консоль, и вы вводите команду для управления машиной. Это выглядит так:
while(true) do
io.write("Enter command\n>")
cmd = io.read()
-- running code to process the command
end
Но проблема в том, что мне нужна подпрограмма, работающая в фоновом режиме, которая проверяет данные, предоставленные машиной.
while(true) do
-- checking and reacting
end
Как я могу сделать эту работу?
- Я не могу прыгнуть к сопрограмме, ожидая
io.read()
- Недостаточно проверить, когда кто-то использовал команду (иногда я не использую ее в течение нескольких дней, но мне все равно нужно следить за ней)
Я относительно новичок в lua, поэтому, пожалуйста, попробуйте дать простое решение и - если возможно - решение, которое не зависит от сторонних инструментов.
Спасибо:)
2 ответа
Если у вас есть некоторый опыт работы с открытыми компьютерами, вы можете добавить (n асинхронный) прослушиватель для "key_down" и сохранить ввод пользователя в строке (или как хотите).
Например:
local userstr = ""
function keyPressed(event_name, player_uuid, ascii)
local c = string.char(ascii)
if c=='\n' then
print(userstr)
userstr = ""
else
userstr=userstr..c
end
--stores keys typed by user and prints them as a string when you press enter
end
event.register("key_down", keyPressed)
Запуск нескольких задач - это очень широкая проблема, решаемая операционной системой, а не такая простая, как интерпретатор Lua. Это решается гораздо глубже, чем io.read
и занимается проблемами, достаточно многочисленными, чтобы заполнить пару книг. Для lua vm вместо физического компьютера это может быть проще, но все равно нужно углубиться в то, как буквы кода превращаются в операции, выполняемые компьютером.
Похоже, что ваш мод уже подражает функциональности ОС для вас: 1, 2. Я верю, что вам будет лучше, если вы воспользуетесь предоставленной функциональностью.