Schleifenbehandlung in expl3

Schleifenbehandlung in expl3

Ich habe dies im Inneren erwartet \clist_map, aber nicht in diesem Code. Wahrscheinlich die „Dummy“-Frage …

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\pairwise}{mmm}{
    \clist_set_eq:NN \l_tmpa_clist #1
    \clist_set_eq:NN \l_tmpb_clist #2
    \clist_clear:N #3
    \bool_until_do:nn {\clist_if_empty_p:N \l_tmpa_clist}{
        \clist_pop:NN \l_tmpa_clist \l_tmpa_tl
        \clist_pop:NN \l_tmpb_clist \l_tmpb_tl
        \clist_put_right:Nn #3 {\l_tmpa_tl / \l_tmpb_tl}
    }
}
\ExplSyntaxOff

\begin{document}

\def\this{1,2,3,4,5}
\def\that{a,b,c,d,e}

There is \{\this\} and \{\that\}.

\pairwise{\this}{\that}{\result}
\def\expected{1/a,2/b,3/c,4/d,5/e}

Why \{\result\} not equal \{\expected\}?

\end{document}

Antwort1

Der Befehl \clist_put_right:Nnwird \l_tmpa_tlin der Eingabe belassen, also beim Aufruf \resultauf die Gleichheit von „ \l_tmpa_tlenthält “ 5und \l_tmpb_tl„enthält“ geprüft e.

Um jedoch den paarweisen Inhalt zu erhalten , muss X/Yder aktuelle Wert von \l_tmpa_tlund ausgewertet (erweitert) und in der Variablen gespeichert werden. Verwenden Sie daher den Typ:\l_tmpb_tl\clistx

\clist_put_right:Nx #3 {\l_tmpa_tl/\l_tmpb_tl}

Höchstwahrscheinlich \seqkönnte eine Liste schneller sein, aber das hängt vom Anwendungsfall ab.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\pairwise}{mmm}{
  \clist_set_eq:NN \l_tmpa_clist #1
  \clist_set_eq:NN \l_tmpb_clist #2
  \clist_clear:N #3
  \bool_until_do:nn {\clist_if_empty_p:N \l_tmpa_clist}{
    \clist_pop:NN \l_tmpa_clist \l_tmpa_tl
    \clist_pop:NN \l_tmpb_clist \l_tmpb_tl
    \clist_put_right:Nx #3 {\l_tmpa_tl / \l_tmpb_tl}
  }
}
\ExplSyntaxOff

\begin{document}

\def\this{1,2,3,4,5}
\def\that{a,b,c,d,e}

There is \{\this\} and \{\that\}.

\pairwise{\this}{\that}{\result}
\def\expected{1/a,2/b,3/c,4/d,5/e}

Now \{\result\} is equal to \{\expected\}?

\end{document}

Bildbeschreibung hier eingeben

Antwort2

Sie müssen dieWertder Token-Listenvariable, nicht der Token-Liste.

Hier ist ein anderer Ansatz mit Sequenzen und \seq_mapthread_function:NNN, der zwei Sequenzen durchläuft und die Elemente an eine Funktion mit zwei Argumenten übergibt.

Sie können `\pairwise als optionales Argument einen anderen Ausgabetrenner geben, also zum Beispiel

\pairwise[|]{a,b}{1,2}{\result}

würde definieren \resultzu a/1|b/2.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\pairwise}{O{,}mmm}
 {
  \seq_set_from_clist:No \l_komarov_first_seq { #2 }
  \seq_set_from_clist:No \l_komarov_second_seq { #3 }
  \seq_clear:N \l_komarov_output_seq
  \seq_mapthread_function:NNN
    \l_komarov_first_seq
    \l_komarov_second_seq
    \komarov_addentry:nn
  \tl_set:Nx #4 { \seq_use:Nn \l_komarov_output_seq { #1 } }
 }
\seq_new:N \l_komarov_first_seq
\seq_new:N \l_komarov_second_seq
\seq_new:N \l_komarov_output_seq
\cs_generate_variant:Nn \seq_set_from_clist:Nn { No }
\cs_new_protected:Nn \komarov_addentry:nn
 {
  \seq_put_right:Nn \l_komarov_output_seq { #1 / #2 }
 }
\ExplSyntaxOff

\begin{document}

\newcommand\this{1,2,3,4,5}
\newcommand\that{a,b,c,d,e}

There is \{\this\} and \{\that\}.

\pairwise{\this}{\that}{\result}
\newcommand\expected{1/a,2/b,3/c,4/d,5/e}

Now \{\result\} equals \{\expected\}

\pairwise{1,2,3,4,5}{a,b,c,d,e}{\newresult}

Also \{\newresult\} equals \{\expected\}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen