![Невозможно скомпилировать скрипты Lua/LuaTeX с сопрограммами [coroutine.yield] и](https://rvso.com/image/476170/%D0%9D%D0%B5%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D1%81%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B%20Lua%2FLuaTeX%20%D1%81%20%D1%81%D0%BE%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D0%BC%D0%B8%20%5Bcoroutine.yield%5D%20%D0%B8%20.png)
Этот вопрос касается сопрограмм Lua, функциональности, к которой я хочу получить доступ в моих скриптах Lua/LuaTeX. Следующие фрагменты без аргумента или с аргументом для передачи (в последнем случае это то, что я хочу в качестве конечной цели).
Как полный новичок в скриптах Lua/LuaTeX, я проделал много проб и ошибок без успеха, но изначальная ошибка, безусловно, очевидна для экспертов. После прочтения нескольких постов и документации, для объявления сопрограмм доступны две ориентации: через именованную функцию или нет. Для этих двух способов, похоже, проблема исходит из функций coroutine.yield
и (и/или) coroutine.results
.
Несколько примеров с LuaTeX, которые я видел, датируются 2010/2011 годами; возможно, за это время произошли какие-то изменения. Что я упустил в случае изменений? Поэтому, почему мой код "грязный"? (Мне немного сложно отлаживать его на данный момент)
Тестирование кода
\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}
решение1
Сообщение об ошибке, по-видимому, означает, что вы вызываете сопрограмму как функцию. Вызов через coroutine.resume
выполняется без ошибок, но я не уверен, какой результат предполагается.
\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}