使用 \csname ... \endcsname; 的简单字典数据结构存在嵌套问题

使用 \csname ... \endcsname; 的简单字典数据结构存在嵌套问题

下面我尝试实现一个简单的字典数据结构。除了尝试嵌套两个这样的字典外,其他都运行正常。在以下代码的最后一行中,结果为“key2”,而预期的是“val2”。

我显然遗漏了“\returnvalue.get”如何扩展的一些内容。任何想法都将不胜感激。

\def\newdict #1{

  \expandafter\edef\csname #1 \endcsname{#1} 


  \expandafter\def\csname #1.set \endcsname##1##2{
    \expandafter\def\csname #1.##1\endcsname{##2}
  }


  \expandafter\def\csname #1.get \endcsname##1{
    \csname #1.##1\endcsname
  }


}

\newdict{dict1}
\newdict{dict2}

\csname dict1.set \endcsname{key1}{val1}
\csname dict1.get \endcsname{key1}        %prints 'val1'

\csname dict2.set \endcsname{key2}{val2}
\csname dict2.get \endcsname{key2}        %prints 'val2'

\csname dict1.set \endcsname{key3}{dict2}
\csname dict1.get \endcsname{key3}        %prints 'dict2'

\def\proxyname{dict2}
\csname \proxyname.set \endcsname{key4}{val4}
\csname dict2.get \endcsname{key4}              %prints 'val4'
\csname \proxyname.get \endcsname{key2}         %prints 'val2'

\edef\returnvalue{\csname dict1.get \endcsname{key3}}
\returnvalue                              %prints 'dict2'

\csname \returnvalue.get \endcsname{key2} %prints 'key2'

答案1

您有几个未受保护的行尾,它们算作空格。我添加的一些行尾其实并不重要,但添加它们是一种很好的做法。

\def\newdict #1{%
  \expandafter\edef\csname #1 \endcsname{#1}%
  \expandafter\def\csname #1.set \endcsname##1##2{% <-- Important
    \expandafter\def\csname #1.##1\endcsname{##2}%
  }%
  \expandafter\def\csname #1.get \endcsname##1{% <-- Important
    \csname #1.##1\endcsname
  }%
}

\newdict{dict1}
\newdict{dict2}

\csname dict1.set \endcsname{key1}{val1}
\csname dict1.get \endcsname{key1}        %prints 'val1'

\csname dict2.set \endcsname{key2}{val2}
\csname dict2.get \endcsname{key2}        %prints 'val2'

\csname dict1.set \endcsname{key3}{dict2}
\csname dict1.get \endcsname{key3}        %prints 'dict2'

\def\proxyname{dict2}
\csname \proxyname.set \endcsname{key4}{val4}
\csname dict2.get \endcsname{key4}              %prints 'val4'
\csname \proxyname.get \endcsname{key2}         %prints 'val2'

\edef\returnvalue{\csname dict1.get \endcsname{key3}}
\returnvalue                              %prints 'dict2'

\csname \returnvalue.get \endcsname{key2} %prints 'val2'

\bye

在此处输入图片描述

相关内容