[luatex] \lastnamedcs and \begincsname with empty csname

David Carlisle d.p.carlisle at gmail.com
Sun Jan 7 23:15:23 CET 2018


On 7 January 2018 at 21:34, Joseph Wright
<joseph.wright at morningstar2.co.uk> wrote:
> Hello,
>
> Testing out how \lastnamedcs and \begincsname behave for some LaTeX kernel
> work, the following has come up:
>
> \def\test#1{%
>   \expandafter\def\csname #1\endcsname{abc}
>   \message{\begincsname #1\endcsname}}
> \test{x}
> \test{y}
> \test{}
>
> \expandafter\let\expandafter\x\csname abc\endcsname
> \show\x
> \expandafter\show\lastnamedcs a
>
> \expandafter\let\expandafter\x\csname hbox\endcsname
> \show\x
> \expandafter\show\lastnamedcs b
>
>
> \expandafter\let\expandafter\x\csname\endcsname
> \show\x
> \expandafter\show\lastnamedcs c
>
> \end
>
> As you'll see, with an empty csname, both \lastnamedcs and \begincsname give
> (possibly) surprising results. Is this by-design?
>
> Joseph

Another example, the luatex manual, when introducing \lastnamedcs
indicates that the constructs \usea and \useb below are equivalent,
\useb (using \lastnamedcs) is noticeably quicker, but they are not
equivalent and the extra tests that #1 is empty and if so falling back
on a test of \csname\endcsname complicate the macro coding and use up
much of the speed differences.

Should not \lastnamedcs expand to the token with empty csname after
\csname\endcsname ?

David



\def\defn#1{\expandafter\def\csname#1\endcsname}

\def\usea#1{%
\ifcsname#1\endcsname
  \csname#1\endcsname
\fi}

\def\useb#1{%
\ifcsname#1\endcsname
  \lastnamedcs
\fi}



\defn{abc}{hello}

a:\usea{abc}

b:\useb{abc}

but

\defn{}{???}

a: \usea{}

b: \useb{}



\bye


More information about the luatex mailing list