下面我尝试实现一个简单的字典数据结构。除了尝试嵌套两个这样的字典外,其他都运行正常。在以下代码的最后一行中,结果为“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