`expl3` 创建返回布尔值的“函数”,并传递给 `\bool_if`

`expl3` 创建返回布尔值的“函数”,并传递给 `\bool_if`

我试图理解如何抽象expl3代码抽象为“函数”。

到目前为止,我有一个有效的宏来检测标记是否是大写字母:

\ExplSyntaxOn
\DeclareDocumentCommand\iscapital{m} {
    \str_if_eq:eeTF {#1} {\tl_upper_case:n { #1 }} { T }{ F }
}
\ExplSyntaxOff

a: \iscapital{a}
A: \iscapital{A}

我尝试用两种方式来抽象这一点:

方法 1:

\ExplSyntaxOn
\DeclareDocumentCommand\iscapital{m} {
    \bool_if:nTF { \__iscapital:n {#1} }{ T }{ F }
}
\cs_new_protected:Nn \__iscapital:n {
    \str_if_eq:eeTF {#1} {\tl_upper_case:n { #1 }} {\c_true_bool}{\c_false_bool}
}
\ExplSyntaxOff

方法 2:

\ExplSyntaxOn
\DeclareDocumentCommand\iscapital{m} {
    \bool_if:nTF { \__iscapital:n {#1} }{ T }{ F }
}
\cs_new_protected:Nn \__iscapital:n {
    \tl_set:Nn \l_tmpa_tl {#1}
    \tl_set:Nn \l_tmpb_tl { \tl_upper_case:n { #1 } }

    \str_if_eq:eeTF \l_tmpa_tl \l_tmpb_tl { \c_true_bool }{ \c_false_bool }
}
\ExplSyntaxOff

方法 1 有效,但方法 2 出错。这是为什么?有没有办法制作一个像方法 2 那样的“函数”,在评估之前完成大量工作\c_*_bool

答案1

您似乎想要完全可扩展的功能,所以不行\tl_set:Nn

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewExpandableDocumentCommand{\iscapitalTF}{mmm}
 {
  \siefken_if_capital:eTF { \tl_head:n { #1 } } { #2 } { #3 }
 }

\prg_new_conditional:Nnn \siefken_if_capital:n { p,T,F,TF }
 {
  \str_if_eq:eeTF { \str_uppercase:n { #1 } } { #1 }
   {
    \prg_return_true:
   }
   {
    \prg_return_false:
   }
 }
\prg_generate_conditional_variant:Nnn \siefken_if_capital:n { e } { p,T,F,TF }
\ExplSyntaxOff

\begin{document}

a: \iscapitalTF{a}{T}{F}

A: \iscapitalTF{A}{T}{F}

abc: \iscapitalTF{abc}{T}{F}

Abc: \iscapitalTF{Abc}{T}{F}

\end{document}

在此处输入图片描述

相关内容