#lua #minecraft-forge
Вопрос:
Я хочу что-то вроде этого:
local co1 = coroutine.create(function()
local evt, _, _, nm, arg1 = event.pull("thread_msg", 2)
-- Pull a "thread_msg" event.
if(nm == coroutine_name)then
print(evt, arg1) -- Print the event name and the argument sent by "thread_msg"
end
end)
coroutine.resume(co1)
event.push("thread_msg", "co1", "") -- Sends a message to the coroutine
Мне нужно имя соратника. событие «thread_msg» отправляет всем запущенным сопрограммам, то же самое для сопрограммы.отправить. Мне нужно получить имя сорутина внутри сорутина.
Работа с открытыми компьютерами с mc версии 1.12.2 forge. Архитектура процессора-lua 5.3. Спасибо.
Ответ №1:
Вы можете load()
использовать код сопрограммы.
Потому что с load()
помощью вы можете дать функциям имя, которое будет храниться в source
debug.getinfo()
таблице «оф».
Это source
также будет использоваться, если в обратной трассировке сопрограммы/функции возникнет ошибка.
Я приведу вам базовый пример интерактивной консоли Lua с функцией easy/lazy coroutine.wrap()
для создания функции сопрограммы…
$ /usr/bin/lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
> code={}
> run={}
> code.co=[[return coroutine.wrap(function(...)
>> local args={...} -- args is holding arguments
>> args[0]=debug.getinfo(1).source -- Name given by load(textcode,'Name')
>> print(args[0],'Going to yielding now')
>> coroutine.yield(args)
>> args=[0]=debug.getinfo(1).source -- Update args[0] here if called more coroutines in loop
>> print('Going to end:',args[0])
>> print(args[0],'Coroutine goes dead now')
>> return args
>> end)]]
> run[1]=load(code.co,'Megacoroutine')()
> run[1]()
Megacoroutine Going to yielding now
table: 0x565e2890
> run[1]()
Going to end: Megacoroutine
Megacoroutine Coroutine goes dead now
table: 0x565e2890
> run[1]()
stdin:1: cannot resume dead coroutine
stack traceback:
[C]: in field '?'
stdin:1: in main chunk
[C]: in ?
>
РЕДАКТИРОВАТЬ: аргументы должны быть локальными (исправлено)
Комментарии:
1. Спасибо, это поможет мне создать модуль потоковой передачи для операционной системы. Я скоро опубликую его на github. Я создаю эту ОС, потому что мне нужна система, похожая на Linux, а обычный редактор — это такой мусор.
2. Для чего используется «режим» при загрузке?
3. Двоичный файл «mode» («b») невозможен с функцией сопрограммы ( я попробовал, и это выдает ошибку ).
code.co
является «t» (текстовый фрагмент), а по умолчанию для режима используется «bt», поэтомуload()
проверяетcode.co
«текстовый» или «двоичный» фрагмент. Но это нормально при использовании explizit «t» в качестве «режима» дляcode.co
. Двоичный фрагмент создаетсяstring.dump()
с функцией в качестве аргумента.4. Ошибка стиля функции, которую я должен исправить, состоит в том, чтобы сделать args локальными в сопрограмме, иначе каждый новый созданный (с загрузкой(code.co, «новое имя»)) сопрограмма переопределяет глобальные аргументы, которые, вероятно, нежелательны.
5. Это не пломба, я уже знаю, но в любом случае спасибо, все, что я иногда делаю, это глотаю этот сладкий сочный код и вставляю его в свои программы, что также означает, что я не читаю код, поэтому да, мне нужно отлаживать в течение нескольких часов, чтобы его исправить :P. Но не называйте меня пыхтуном, пожалуйста, я не заслуживаю того, чтобы попасть в тюрьму пыхтуна, я обещаю, что не украду много кода:, ^(