Funktion return — expl3

Funktion return — expl3

Wie kann ich die Funktion daran hindern, den Rest des Codes auszuführen, wenn in Latex3 bestimmte Bedingungen erfüllt sind?

Jetzt muss ich verschachtelte Bedingungen erstellen und einige Standardfälle duplizieren. Die Lesbarkeit des Codes wird schlechter, wenn der Standardfall recht groß ist.

\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

Hier ist, was ich in Bezug auf die Programmiersprache haben möchte

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

    return <default case>;
}

Antwort1

Es gibt mehrere Möglichkeiten, dies zu erreichen. Ich würde wahrscheinlich einen prädikatbasierten Ansatz und eine verzögerte Auswertung verwenden:

\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

In komplexeren Fällen würde ich die „Nutzlast“ (Aktionen) normalerweise in Hilfsprogramme packen.


Wenn Sie auf das Format „Return“ festgelegt sind, benötigen Sie ein Endmarker-Token

\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}

aber ehrlich gesagt würde ich bei Prädikaten und entsprechenden Hilfsverben bleiben.

verwandte Informationen