Возврат функции — expl3

Возврат функции — expl3

Как остановить выполнение остальной части кода функцией, если в latex3 выполняются некоторые условия?

Теперь мне нужно построить вложенные условия и продублировать пару случаев по умолчанию. Читаемость кода ухудшается, если случай по умолчанию довольно большой.

\ExplSyntaxOn
\cs_set:Npn \my_func #1 {
    \token_if_cs:NTF #1 {
        \str_eq:nnTF {#1} {\\} {
            first case
        }{
            \token_if_expandable:NTF #1 {
                second case
            }{
                default
            }
        }
    }{
        default
    }
}

\my_func{\\}
\ExplSyntaxOff

Вот что я хотел бы иметь в плане языка программирования

function(arg){
    if(condition 1){
        return <first case>;
    }
    if(condition 2){
        return <second case>;
    }

    return <default case>;
}

решение1

Есть несколько способов добиться этого. Я бы, скорее всего, использовал подход на основе предикатов и ленивую оценку:

\ExplSyntaxOn
\cs_set:Npn \my_func:N #1
  {
    \bool_lazy_and:nnTF
      { \token_if_cs_p:N #1 }
      { \token_if_expandable_p:N #1 }
      {
        \str_if_eq:nnTF {#1} { \\ }
          { first case }
          { second case }
      }
      { default }
  }

\my_func:N { \\ }
\ExplSyntaxOff

В более сложных случаях я обычно помещаю «полезную нагрузку» (действия) во вспомогательные функции.


Если вы привязаны к формату «возврат», вам нужен какой-то маркер конца.

\cs_set:Npn \my_func:N #1
  {
    \token_if_cs:NF #1
      { \__my_func_return:nw { not-a-cs } }
    \token_if_expandable:NF #1
      { \__my_func_return:nw { not-expandable } }
    \__my_func_return:nw { default }
    \__my_func_end:
  }
\cs_new_eq:NN \__my_func_end: \prg_do_nothing:
\cs_new:Npn \__my_func_return:nw #1#2 \__my_func_end:
  {#1}

но, честно говоря, я бы остановился на предикатах и ​​соответствующих вспомогательных глаголах.

Связанный контент