Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4

14 Apr '20, 20:12

cgnieder's gravatar image

cgnieder
22.1k253463

Die scheinbar unterschiedlichen Ergebnisse ergeben sich aus der Tatsache, dass `\token_if_eq_meaning:NNTF` ein Makro ist und daraus, wie Makros ihre Argumente lesen. Du hast recht: `\ifx` vergleicht die zwei als nächstes folgenden **Token**, das heißt im Fall von \ifx{\ss}\ss ...\else...\fi dass `{` mit `\ss` verglichen wird. Das sind zwei Token mit verschiedenem „Meaning“, also ist das Ergebnis falsch. Hier siehst du's auch nochmal: 1: \ifx{\ss}\ss gleich\else ungleich\fi % ungleich 2: \ifx\ss\ss gleich\else ungleich\fi % gleich \end Warum funktioniert's dann mit `\token_if_eq_meaning:NNTF`? Antwort: weil es ein Makro ist und ein Makro als Argument entweder *ein* *entweder* ein Token nimmt oder *oder* eine „braced group“ und dabei das äußere Paar „Braces“ entfernt. Darum gibt hier alles „gleich“ „gleich“: \long\def\firstoftwo#1#2{#1} \long\def\secondoftwo#1#2{#2} \def\tokenifeqmeaning#1#2{% \ifx#1#2\expandafter\firstoftwo\else\expandafter\secondoftwo\fi } 1: \tokenifeqmeaning{\ss}\ss{gleich}{ungleich} % gleich 2: \tokenifeqmeaning\ss\ss{gleich}{ungleich} % gleich 2: \tokenifeqmeaning{\ss}{\ss}{gleich}{ungleich} % gleich \end ---- Noch was zu expl3: ein `N` als Argument Specifier bedeutet immer *nimm ein Token* und *keine* braced group, im Gegensatz zu `n`, das genau das Gegenteil bedeutet. Als Code-Schreiber sollte man da drauf achten und User-Input ggf vorab „bearbeiten“, damit man der Funktion das richtige zu essen gibt. Man **Man darf sich nicht auf die Implementierung einer „Funktion“ verlassen, sondern nur auf ihre dokumentierte Funktionsweise. Funktionsweise.** Man könnte nun zwar mit einigem Recht behaupten, dass `\token_if_eq_meaning:NNTF {\ss}` das falsche Ergebnis liefert, da `.{` und `\ss` nun mal nicht gleich sind, aber es ist dokumentiert, dass das nicht geht: > Note that an explicit begin group token cannot be tested in this way, as it is not a valid `N`-type argument. Das heißt nichts anderes als, dass `\token_if_eq_meaning:NNTF {\ss}` falsche Anwendung ist. ist. Das gleiche gilt für `\meinbefehl:N {ab}`. Das ist ebenfalls eine falsche Anwendung. Dass dann was anderes herauskommt als erwartet, sollte nicht überraschen.
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

14 Apr '20, 20:04

cgnieder's gravatar image

cgnieder
22.1k253463

Die scheinbar unterschiedlichen Ergebnisse ergeben sich zum einen aus einem Missverständnis von dir und zum anderen aus der Tatsache, dass `\token_if_eq_meaning:NNTF` ein Makro ist und daraus, wie Makros ihre Argumente lesen. Zum Missverständnis: Du hast recht: `\ifx` vergleicht die zwei als nächstes folgenden **Token**, das heißt im Fall von \ifx{\ss}\ss ...\else...\fi dass `{` mit `\ss` verglichen wird. Das sind zwei Token mit verschiedenem „Meaning“, also ist das Ergebnis falsch. Hier siehst du's auch nochmal: 1: \ifx{\ss}\ss gleich\else ungleich\fi % ungleich 2: \ifx\ss\ss gleich\else ungleich\fi % gleich \end Warum funktioniert's dann mit `\token_if_eq_meaning:NNTF`? Antwort: weil es ein Makro ist und ein Makro als Argument entweder *ein* Token nimmt oder eine „braced group“ und dabei das äußere Paar „Braces“ entfernt. Darum gibt hier alles „gleich“ \long\def\firstoftwo#1#2{#1} \long\def\secondoftwo#1#2{#2} \def\tokenifeqmeaning#1#2{% \ifx#1#2\expandafter\firstoftwo\else\expandafter\secondoftwo\fi } 1: \tokenifeqmeaning{\ss}\ss{gleich}{ungleich} % gleich 2: \tokenifeqmeaning\ss\ss{gleich}{ungleich} % gleich 2: \tokenifeqmeaning{\ss}{\ss}{gleich}{ungleich} % gleich \end ---- Noch was zu expl3: ein `N` als Argument Specifier bedeutet immer *nimm ein Token* und *keine* braced group, im Gegensatz zu `n`, das genau das Gegenteil bedeutet. Als Code-Schreiber sollte man da drauf achten und User-Input ggf vorab „bearbeiten“, damit man der Funktion das richtige zu essen gibt. ---- gibt. Man darf sich nicht auf die Implementierung einer „Funktion“ verlassen, sondern nur auf ihre dokumentierte Funktionsweise. Man könnte nun zwar mit einigem Recht behaupten, dass `\token_if_eq_meaning:NNTF {\ss}` das falsche Ergebnis liefert, da `.{` und `\ss` nun mal nicht gleich sind, aber: aber es ist dokumentiert, dass das nicht geht: > Note that an explicit begin group token cannot be tested in this way, as it is not a valid `N`-type argument. Das heißt nichts anderes als, dass `\token_if_eq_meaning:NNTF {\ss}` falsche Anwendung ist.
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

14 Apr '20, 19:28

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

14 Apr '20, 19:21

cgnieder's gravatar image

cgnieder
22.1k253463

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×