Как я смогу получить имя сопрограммы в целевой сопрограмме?

#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. Но не называйте меня пыхтуном, пожалуйста, я не заслуживаю того, чтобы попасть в тюрьму пыхтуна, я обещаю, что не украду много кода:, ^(