
Ich suche nach einer guten Erklärung der Unterschiede und Anwendungsfälle zwischen tl_map_function:nN
und tl_map_inline:Nn
. Ich stelle einen MWE für bereit, inline
der 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:nN
und \tl_map_function:NN
sind vollständig erweiterbar (mit x
-expansion, nicht f
-expansion), die inline
Version jedoch nicht.
Die function
Version 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
inline
Ausfü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
function
Ausfü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:nn
die einfachere Version zu bevorzugen, da hier keine neue Funktion definiert werden muss. Wenn der Code jedoch komplizierter wird, function
sollte 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 inline
Version erleichtert das Hinzufügen von Haltepunkten; die function
Version erfordert eine speziell zugeschnittene Funktion, die enthält \tl_map_break:
.
Außerdem function
ist 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).