On 1/27/2023 10:13 AM, Henri Menke via ntg-context wrote:
On Thu, 2023-01-26 at 23:07 +0100, Hans Hagen via ntg-context wrote:
On 1/26/2023 9:33 PM, Henri Menke via ntg-context wrote:
\directlua{
    userdata = userdata or {}
    function userdata.test()
      tex.print("\string\\numexpr 17\string\\relax")
    end
}

\tt
\protected\def\test{\directlua{userdata.test()}}
\meaning\test\par
\edef\x{\test}\meaning\x\par
\the\test

\directlua{
    local t = lua.get_functions_table()
    t[\string#t + 1] = userdata.test
    token.set_lua("test", userdata.test, \string#t, "protected")
}
\meaning\test\par
\edef\x{\test}\meaning\x\par
\the\test
from the code it looks like we're talking plain luatex ...

\the is very selective and doesn't work for all primitives or macros

compare it to \number which accepts any number representation
following
it while \the doesn't work ok 123

that said, your set_lua is wrong and passes a function as well as an
index

\directlua{
     lua.get_functions_table()[999] = function()
       tex.print("\string\\numexpr 17\string\\relax")
     end
     token.set_lua("test", 999)
}

\the    \test % needs the \numexpr

\number \test % doesn't

\count0 \test % needs the \numexpr

\count0=\test % doesn't

etc

Thanks for pointing out my mistake. Your example works fine but now the
luacall is no longer protected and will therefore fully expand in
\edef. So do I understand this correctly that there is no way to make
the second \the\test work?

\directlua{
     lua.get_functions_table()[999] = function()
       tex.pri
nt("\string\\numexpr 17\string\\relax")
     end
}

\tt
\directlua{token.set_lua("test", 999)}
\meaning\test\par % expandable luacall 999
\edef\x{\test}\meaning\x\par % macro:->\numexpr 17\relax
\the\test % 17

\directlua{token.set_lua("test", 999, "protected")}
\meaning\test\par % luacall 999
\edef\x{\test}\meaning\x\par % macro:->\test
\the\test % ! You can't use `luacall 999' after \the.

\bye
you can do

\directlua{
   function TestCmd()
     tex.print("\string\\numexpr 17\string\\relax")
   end
}

\protected\def\test{\directlua{TestCmd()}}

or, more efficient:

\directlua{
   function TestCmd()
     tex.print("17")
   end
}

\protected\def\test{\numexpr\directlua{TestCmd()}\relax}

Hans

-----------------------------------------------------------------
                                          Hans Hagen | PRAGMA ADE
              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
       tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / https://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : https://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : https://contextgarden.net
___________________________________________________________________________________

Reply via email to