Esta questão trata das corrotinas Lua, uma funcionalidade que desejo acessar em meus scripts Lua/LuaTeX. Os trechos a seguir estão sem ou com argumento para passar (para este último, é isso que desejo como objetivo final).
Como um iniciante em scripts Lua/LuaTeX, fiz muitas tentativas/erros sem sucesso, mas o erro original deve ser certamente óbvio para especialistas. Após a leitura de diversos posts e documentações, duas orientações estão à disposição para declarar corrotinas: via função nomeada ou não. Para essas duas formas de fazer, parece que o problema vem das funções coroutine.yield
e (e/ou) coroutine.results
.
Os poucos exemplos com LuaTeX que vi datam de 2010/2011; pode haver algumas modificações nesse meio tempo. O que perdi em caso de mudança? Portanto, por que minha codificação está "suja"? (É um pouco difícil depurar para mim no momento)
Teste de código
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
-- Main function of the coroutine
--function luadisplay (argval)
-- tex.print("..argval..")
function luadisplay ()
for i = 0, 1, 1 do
if i==0 then
tex.print{"OK0"}
tex.print(coroutine.yield())
end
if i==1 then
tex.print{"OK1"}
tex.print(coroutine.yield())
end
end
end
-- Creating coroutine
luacoroutine = coroutine.create(luadisplay)
-- Starting and obtaining results
--tex.print("coroutine.resume(luacoroutine)") -- Does not work if "coroutine.yield" uncommented
\end{luacode}
\begin{luacode} -- That's compile but can't obtain result
-- Creating the damned coroutine directly (without argument)
myco = coroutine.create( function()
for i = 0, 1, 1 do
if i==0 then
tex.print{"OK0"}
tex.print(coroutine.yield())
end
if i==1 then
tex.print{"OK1"}
tex.print(coroutine.yield())
end
coroutine.resume(myco)
end
end)
\end{luacode}
%\directlua{require("luatexse.lua")} % If external file
%\newcommand{\luacoroutinecmd}{\directlua{luacoroutine()}} -- Without argument not works
%\newcommand{\luacoroutinecmd}[1]{\directlua{luacoroutine("#1")}} -- With argument not works
%\newcommand{\mycocmd}{\directlua{myco()}} -- Without argument not works
\parindent=0pt
\begin{document}
Is it work?
\bigskip\bigskip
%\luacoroutinecmd{Hi!}
\end{document}
Responder1
A mensagem de erro aparentemente significa que você está chamando a corrotina como uma função. Chamá-lo via coroutine.resume
é executado sem erros, mas não tenho certeza do resultado pretendido.
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
-- Main function of the coroutine
--function luadisplay (argval)
-- tex.print("..argval..")
function luadisplay (m)
for i = 0, 1, 1 do
if i==0 then
tex.print{"OK0[" .. m .. "]"}
tex.print(coroutine.yield())
end
if i==1 then
tex.print{"OK1[" .. m .. "]"}
tex.print(coroutine.yield())
end
end
end
-- Creating coroutine
luacoroutine = coroutine.create(luadisplay)
-- Starting and obtaining results
--tex.print("coroutine.resume(luacoroutine)") -- Does not work if "coroutine.yield" uncommented
\end{luacode}
\newcommand{\luacoroutinecmd}[1]{\directlua{coroutine.resume(luacoroutine,"#1")}} %-- With argument not works
\parindent=0pt
\begin{document}
Is it work?
\bigskip\bigskip
A \luacoroutinecmd{Hi!}
\bigskip\bigskip
B \luacoroutinecmd{Hi!}
\bigskip\bigskip
C \luacoroutinecmd{Hi!}
\end{document}