在文档中接口3xxxx_if_exist
,对于xxxx模式为 的几个宏bool
,以及许多其他宏str
,seq
出现以下内容:
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
简短回答:它们的定义目前没有任何区别。区别在于语义。
尝试给出一个稍微长一点的答案:
请注意,至少对于常规宏名称来说,这不是问题,不应该有像整数变量一样命名的宏,例如,它被定义但实际上不是整数。因此,这是一个在性能与测试的完全正确性之间取得平衡的明显例子,在这里性能显然胜出;这就是我们如此强烈提倡使用命名约定的原因。