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

avatar
Andrew lua
9 августа 2021 в 05:00
113
1
2

Я хочу что-то вроде этого:

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» отправляет всем запущенным сопрограммам, то же самое для coroutine.send. Мне нужно получить имя сопрограммы внутри сопрограммы.

Работа с opencomputers с mc версии 1.12.2 forge. Архитектура процессора lua 5.3. Спасибо.

Источник

Ответы (1)

avatar
koyaanisqatsi
9 августа 2021 в 09:00
2

Вы можете load() код сопрограммы.
Потому что с load() вы можете дать функциям имя, которое будет храниться в source таблицы debug.getinfo()'.
Этот source также будет использоваться в случае возникновения ошибки в трассировке сопрограммы/функции.
Я даю вам базовый пример интерактивной консоли Lua с простой/ленивой функцией 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 ?
>

EDIT: аргументы должны быть локальными (исправлено)

Andrew lua
9 августа 2021 в 10:15
0

Спасибо, это поможет мне сделать модуль потоковой обработки для операционной системы. Скоро опубликую на гитхабе. Я делаю эту ОС, потому что мне нужна система, похожая на Linux, а обычный редактор — это мусор.

Andrew lua
9 августа 2021 в 10:21
0

Для чего используется «режим» в нагрузке?

koyaanisqatsi
9 августа 2021 в 10:38
0

Двоичный файл «mode» («b») невозможен с функцией сопрограммы (я пытался, и это выдает ошибку). code.co — это «t» (текстовый фрагмент), а режим по умолчанию — «bt», поэтому load() проверяет, что code.co является «текстовым» или «двоичным» фрагментом. Но это нормально при использовании explizit «t» как «mode» для code.co. Двоичный фрагмент создается с помощью string.dump() с функцией в качестве аргумента.

koyaanisqatsi
9 августа 2021 в 14:08
0

Ошибка стиля функции, которую я должен исправить, заключается в том, чтобы сделать аргументы локальными в сопрограмме, иначе каждая новая созданная (с load(code.co,'newname')) сопрограмма переопределяет глобальные аргументы, что, вероятно, нежелательно.

Andrew lua
9 августа 2021 в 17:31
0

Это не проблема, я уже знаю, но все равно спасибо, все, что я иногда делаю, это пью этот сладкий сочный код и вставляю его в свои программы, что также означает, что я не читаю код, так что да, я должен отлаживайте в течение нескольких часов, чтобы исправить: P. Но не называйте меня пыхтителем, пожалуйста, я не заслуживаю тюрьмы за пыхтение, я обещаю, что не буду воровать много кода :,^(

koyaanisqatsi
9 августа 2021 в 19:37
0

Да, вы заработали Chuggy Batch ;-P - И имейте в виду, что приведенный выше код «играет без таблицы аргументов», построенной из трех точек и из них. Эта таблица, содержащая аргументы из первого вызова сопрограммы, нужна вам для дальнейших действий. Я предполагаю, что args[0] содержит debug.getinfo(1).source, как в C и других языках. Тогда вы не будете каждый раз копировать более длинный debug.getgetinfo(1).source туда, куда хотите. Момент, когда я поместил его в приведенный выше код :-)