Syntaxregeln für „Variable“

Syntaxregeln für „Variable“

Ich habe die letzte Ausgabe vonMetafontBook(8. Auflage, Band C). Seit dieser Auflage (und damit seit allen anderen Auflagen) erschienen zwei sehr merkwürdige Korrekturen inKorrekturen:

1)

Bildbeschreibung hier eingeben

Frage zu dieser Korrektur:

ASuffixist entweder eine leere Menge oder eine beliebige Anzahl von <tag>s oder <subscript>s in beliebiger Kombination (siehe Syntaxregeln auf S. 54). Also <subscript>ist a eine Teilmenge vonSuffixDaher ist es nicht klar, warum gesagt wird

mit Suffix oder Index

als ob es sich um getrennte Eigenschaften handeln würde.

2)

Bildbeschreibung hier eingeben

<suffix list>Es lohnt sich, hier eine Definition von : anzugeben .

<suffix list> -> <suffix> | <suffix list>,<suffix>

Frage zu dieser Korrektur:

Können Sie für diesen Fall ein konkretes Beispiel nennen?

Antwort1

Was bedeutet "mit Suffix versehen"? Normalerweise würde man so etwas sagen wie "eine Variable mit einem Suffix". Aber gemäß den Syntaxregeln suffixkann auch ein Suffix verwendet werden , also würde dies bedeuten, dassemptyjedenVariable ist mit einem Suffix versehen. Daher suffixist die Regel nicht die beste Referenz für „mit Suffix versehen“. Wir müssen also eine intuitive Bedeutung von „mit Suffix versehen“ verwenden. Nun erscheinen Variablen wie x.aund x[2]und verhalten sich manchmal anders, zum Beispiel sind x.aund x.bvöllig anders, aber x[1]und x[2]sind viel stärker verbunden. Also insbesondere nach dem Kommentar

Aber „x.k“ ist nicht dasselbe. Es handelt sich um das Tag „x“, dem das Tag „k“ angehängt ist, und nicht um das Tag „x“, dem der Wert der Variablen k als Index vorangestellt ist.

ein Leser könnte annehmen, dass dies x[k]nicht „suffixiert“ ist. „suffixiert“ allein sollte also ausreichen, aber das könnte in manchen Fällen zu Missverständnissen führen, daher ist es einfacher, einfach „oder tiefgestellt“ hinzuzufügen.

Ein Beispiel für das Suffixlistenproblem ist

newinternal x;
forsuffixes s = x1: show s; endfor
end;

Dies schlägt fehl, da xkein Suffix hinzugefügt werden kann und daher x1ungültig ist. Daher xist , das ein internal quantityund daher ein variableist, kein ein, suffixda es sonst x1auch ein Suffix wäre und in einem zulässig wäre suffix list.

Meiner Meinung nach besteht das Problem hier darin, dass es sich eher um ein Problem mit suffix listals mit der suffixDefinition handelt: Angenommen, interne Variablen sind keine Suffixe, dann

newinternal x;
y.x1 = 1;
end;

sollte auch nicht funktionieren, wird aber von Metafont akzeptiert.

Die genauere Regel könnte also lauten: Eine interne GrößeIsta Suffix und Übung 7.4 ist wahr, aber a suffix listist

<external suffix> -> <empty> | <subscript><suffix> | <external tag><suffix>
<suffix list> -> <external suffix> | <suffix list>,<external suffix>

Antwort2

Dies ist eine kleine Ergänzung zur akzeptierten Antwort – die Zusammenfassung meines Verständnisses.


Korrektur 1):

Der Ausdruck „oder tiefgestellt“ dient dazu, der „intuitiven“ Bedeutung von „Suffix“ tiefgestellte Variablen hinzuzufügen.

Die Sache ist, dass es in MetaFontBook zwei Bedeutungen des Wortes „Suffix“ gibt: „allgemein“ (Syntaxregel auf S. 54) und „intuitiv“ (etwas nicht Leeres außer Index).

Korrektur 2):

die folgenden Beispiele mit x<tag>und x<subscript>funktionieren nicht:

newinternal x;
forsuffixes s = x.k: show s; endfor
end
newinternal x;
forsuffixes s = x[1]: show s; endfor
end

Die folgenden Beispiele funktionieren mit x<tag>und :x<subscript>

newinternal x;
y.x.k = 1;
end
newinternal x;
y.x[1] = 1;
end

Daher muss die zweite Korrektur nicht nur wie in der akzeptierten Antwort angegeben korrigiert werden, sondern es müssen auch „ x<subscript>“ zu „ x<tag>“ hinzugefügt werden.

verwandte Informationen