LaTeX 3-Token-Listenvariablen, Mapping-Funktionen, Unterschiede zwischen Inline-Mapping und Funktionen

LaTeX 3-Token-Listenvariablen, Mapping-Funktionen, Unterschiede zwischen Inline-Mapping und Funktionen

Ich suche nach einer guten Erklärung der Unterschiede und Anwendungsfälle zwischen tl_map_function:nNund tl_map_inline:Nn. Ich stelle einen MWE für bereit, inlineder auch der schnellste zu sein scheint.

\documentclass{article}
\usepackage{expl3,xparse}

\begin{document}
\ExplSyntaxOn
\cs_new:Nn\whatever:n{..{#1}~}
\tl_new:N  \tl_phd_temp_a
\tl_new:N  \tl_phd_temp_b
\tl_new:N  \tl_phd_temp_c
\DeclareDocumentCommand\Test{ }
    {
       \tl_set:Nn  \tl_phd_temp_a {Yiannis Mary John}
       \tl_set:Nn  \tl_phd_temp_b {{Lazarides}{Lou}{Smith}}
       \tl_concat:NNN \tl_phd_temp_c \tl_phd_temp_a \tl_phd_temp_b
       \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
   }   
\ExplSyntaxOff 
\Test
\end{document}

Antwort1

Die Funktionen \tl_map_function:nNund \tl_map_function:NNsind vollständig erweiterbar (mit x-expansion, nicht f-expansion), die inlineVersion jedoch nicht.

Die functionVersion ist auch etwas schneller.

Beispieldatei

\documentclass{article}
\usepackage{expl3}

\begin{document}

\ExplSyntaxOn
\cs_new:Nn\whatever:n{}
\tl_new:N  \tl_phd_temp_a
\tl_new:N  \tl_phd_temp_b
\tl_new:N  \tl_phd_temp_c
\tl_set:Nn  \tl_phd_temp_a {Yiannis Mary John}
\tl_set:Nn  \tl_phd_temp_b {{Lazarides}{Lou}{Smith}}
\tl_concat:NNN \tl_phd_temp_c \tl_phd_temp_a \tl_phd_temp_b

\cs_new:Npn \xinline
 {
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
  \tl_map_inline:Nn\tl_phd_temp_c{\whatever:n{##1}}
 }
\cs_new:Npn \xfunction
 {
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
  \tl_map_function:NN\tl_phd_temp_c \whatever:n
 }

\cs_new:Npn \y #1
 {
  #1 #1 #1 #1 #1 #1 #1 #1 #1 #1
 }
\cs_new:Npn \z #1
 {
  \y{#1}\y{#1}\y{#1}\y{#1}\y{#1}
  \y{#1}\y{#1}\y{#1}\y{#1}\y{#1}
 }
\cs_new:Npn \zz #1
 {
  \z{#1}\z{#1}\z{#1}\z{#1}\z{#1}
  \z{#1}\z{#1}\z{#1}\z{#1}\z{#1}
 }
\cs_new:Npn \zzz #1
 {
  \zz{#1}\zz{#1}\zz{#1}\zz{#1}\zz{#1}
  \zz{#1}\zz{#1}\zz{#1}\zz{#1}\zz{#1}
 }

\ExplSyntaxOff

\zzz{\xinline}
%\zzz{\xfunction}

\stop

inlineAusführung

Dies ist die Antwort vontime

real    0m4.635s
user    0m4.613s
sys     0m0.016s

und dies ist der Speicherbericht

 140188 words of memory out of 5000000

functionAusführung

Dies ist die Antwort vontime

real    0m4.163s
user    0m4.139s
sys     0m0.020s

und dies ist der Speicherbericht

 140188 words of memory out of 5000000

Was ist vorzuziehen? Ich neige dazu, \tl_map_inline:nndie einfachere Version zu bevorzugen, da hier keine neue Funktion definiert werden muss. Wenn der Code jedoch komplizierter wird, functionsollte die Version der besseren Übersichtlichkeit halber verwendet werden. Sie sollte immer dann verwendet werden, wenn die durchzuführende Zuordnung eine an anderer Stelle definierte Funktion verwendet.

Die inlineVersion erleichtert das Hinzufügen von Haltepunkten; die functionVersion erfordert eine speziell zugeschnittene Funktion, die enthält \tl_map_break:.

Außerdem functionist die Version etwas komplexer, wenn die Zuordnung mehr als ein Argument erfordert (wir befinden uns beispielsweise in einer verschachtelten Zuordnung, bei der sowohl das äußere als auch das innere Element verwendet wird).

verwandte Informationen