尝试给出一个稍微长一点的答案:

尝试给出一个稍微长一点的答案:

在文档中接口3xxxx_if_exist,对于xxxx模式为 的几个宏bool,以及许多其他宏strseq出现以下内容:

Tests whether the <boolean> is currently defined. 
This does not check that the <boolean> really is a boolean variable.

Tests whether the <str var> is currently defined. 
This does not check that the <str var> really is a string.

Tests whether the <seq var> is currently defined. 
This does not check that the <seq var> really is a sequence variable.

问题:如果他们不检查输入参数的类型,那么它们之间有什么不同?它们之间有什么不同\cs_if_exist

答案1

它们与 没有任何区别\cs_if_exist:N(TF),因为它们完全一样:expl3-code.tex我们看到(行号仅供参考)

   3503 \prg_new_eq_conditional:NNn \tl_if_exist:N \cs_if_exist:N { TF , T , F , p }

   4846 \prg_new_eq_conditional:NNn \str_if_exist:N \tl_if_exist:N
   4847   { p , T , F , TF }

   5617 \prg_new_eq_conditional:NNn \seq_if_exist:N \cs_if_exist:N
   5618   { TF , T , F , p }

   6427 \prg_new_eq_conditional:NNn \int_if_exist:N \cs_if_exist:N
   6428   { TF , T , F , p }

   7136 \prg_new_eq_conditional:NNn \flag_if_exist:N \cs_if_exist:N
   7137   { TF , T , F , p }

   7287 \prg_new_eq_conditional:NNn \bool_if_exist:N \cs_if_exist:N
   7288   { TF , T , F , p }

   8129 \prg_new_eq_conditional:NNn \clist_if_exist:N \cs_if_exist:N
   8130   { TF , T , F , p }

  10053 \prg_new_eq_conditional:NNn \prop_if_exist:N \cs_if_exist:N
  10054   { TF , T , F , p }

  12842 \prg_new_eq_conditional:NNn \dim_if_exist:N \cs_if_exist:N
  12843   { TF , T , F , p }

  13269 \prg_new_eq_conditional:NNn \skip_if_exist:N \cs_if_exist:N
  13270   { TF , T , F , p }

  13362 \prg_new_eq_conditional:NNn \muskip_if_exist:N \cs_if_exist:N
  13363   { TF , T , F , p }

  17463 \prg_new_eq_conditional:NNn \fp_if_exist:N \cs_if_exist:N { TF , T , F , p }

  22075 \prg_new_eq_conditional:NNn
  22076   \bitset_if_exist:N \str_if_exist:N { p , T , F , TF }

  22491 \prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N
  22492   { TF , T , F , p }

  29177 \prg_new_eq_conditional:NNn \box_if_exist:N \cs_if_exist:N
  29178   { TF , T , F , p }

它们的作用是什么?好吧,未来其中一些功能可能会实际上测试变量是否具有适当的类型,在某些情况下这可能是可能的(老实说,我认为不会这样做)。

他们的目的是好的编程.tl变量是不是a cs,至少从更高层次的角度来看(在最低层次上,两者都是宏)。提供不同的条件有助于将它们分开。

请使用它们,而不是通用的\cs_if_exist:N(TF)

答案2

简短回答:它们的定义目前没有任何区别。区别在于语义。

尝试给出一个稍微长一点的答案:

请注意,至少对于常规宏名称来说,这不是问题,不应该有像整数变量一样命名的宏,例如,它被定义但实际上不是整数。因此,这是一个在性能与测试的完全正确性之间取得平衡的明显例子,在这里性能显然胜出;这就是我们如此强烈提倡使用命名约定的原因。

相关内容