expl3/l3keys/\keyval_parse:nn - 附加顺序的原因是什么和到?

expl3/l3keys/\keyval_parse:nn - 附加顺序的原因是什么和到?

在 2021-07-12 发布的 interface3.pdf 中的“26.8 用于解析键值列表的低级接口”一节中,您可以找到:

\keyval_parse:nnn✩ 新版:2020-12-19 更新版:2021-05-10

\keyval_parse:nnn {⟨code1⟩}{⟨code2⟩}{⟨key–value list⟩}

解析⟨键值列表⟩变成一系列⟨键⟩以及相关⟨价值观⟩,或者仅仅是键(如果没有给出⟨value⟩)。 ⟨代码1⟩收到每个⟨钥匙⟩(没有 ⟨value⟩)作为尾随括号组,而⟨代码2⟩由两个括号组附加,⟨钥匙⟩⟨价值⟩. 顺序 ⟨键⟩在⟨键值列表⟩中被保留。......

我不知道为什么⟨代码2⟩添加的顺序是而不是 。{⟨key⟩}{⟨value⟩}{⟨value⟩}{⟨key⟩}

如果是后者,你可以更轻松地调用完全相同的函数/宏⟨代码1⟩⟨代码2⟩并特此⟨代码1⟩只需为缺失值提供默认值。

在当前状态下您无法做到这一点 - 相反,您需要在未提供值/提供值的两种情况之一中交换参数:

例如,假设有人希望调用一个\__MYMODULE_foobar:nnnn函数

  • 它的第一个参数是短语“foo”,
  • 它的第二个参数是短语“bar”,
  • 它的第三个参数可能是键的名称,
  • 可能它的第四个参数要么是形成值的标记,要么在没有提供值的情况下是短语“bazdefault”。

目前需要做类似的事情:

\cs_new:Nn \__MYMODULE_exchange_i_iii_ii:nnn  { #1 {#3} {#2} }
\cs_new:Nn \__MYMODULE_foobar:nnnn {First~arg~is:#1.~Second~arg~is:#2.~Key~is:~#3.~Value~or~default~is:~#4.}
...
\keyval_parse:nn {  \__MYMODULE_exchange_i_iii_ii:nnn {\__MYMODULE_foobar:nnnn {foo}{bar}} {bazdefault}   }
                 {  \__MYMODULE_foobar:nnnn {foo}{bar}  }
                 {   A=B,C   }
...

如果⟨代码2⟩附加的顺序是而不是,那么可以在-函数中交换最后一个和倒数第二个参数,更简单地执行以下操作:{⟨value⟩}{⟨key⟩}{⟨key⟩}{⟨value⟩}\__MYMODULE_foobar:nnnn

\cs_new:Nn \__MYMODULE_foobar:nnnn {First~arg~is:#1.~Second~arg~is:#2.~Key~is:~#4.~Value~or~default~is:~#3.}
...
\keyval_parse:nn {  \__MYMODULE_foobar:nnnn {foo}{bar}{bazdefault}   }
                 {  \__MYMODULE_foobar:nnnn {foo}{bar}  }
                 {   A=B,C   }
...

我觉得这样很方便。但我不能排除有充分的理由不这样做,我只是不明白,但目前的做法是这样的。

与 的相似性\keyval_parse:NNn较小,因为无论如何你都需要定义两个不同的函数。但在这里,人们可能已经交换了 的两个参数的顺序⟨功能2⟩

相关内容