Makro-Konstrukte |
Makros können zur Definition von neuen Befehlen, Konstrukten, Tags benutzt werden und zur Konstruktion von abstrakten Prozeduren in Stil-Definitionen.
Ältere Versionen von TeXmacs machten einen Unterschied zwischen
Makros, bei denen alle Kinder erreichbar waren und Funktionen, die
Kinder nicht erreichen konnten. Das jetzige TeXmacs kennt nur Makros:
die Erreichbarkeit von Kindern wird heuristisch ermittelt und kann
durch
Dieses Konstrukt erzeugt ein Makro (das TeXmacs-Analogon eines λ-Ausdrucks) mit n Argumenten mit den Namen der Zeichenkette var-1 bis var-n.
Neue Tags werden definiert, indem die Makros im Kontext
gespeichert werden. Meistens werden Makros global gespeichert
mit
<assign|Abkürzung|<macro|x|<group|x>>>
Wenn man ein Makro
Dieses Konstrukt dient dazu, Werte von Variablen innerhalb eines
Makro-Rumpfes zu ermitteln. Z.B. evaluiert <
Dieses Konstrukt ähnelt
Wenn mehr als Argument vorhanden ist, dann expandiert <
Dieses Konstrukt definiert ein Makro (das TeXmacs-Analogon eines
λ-Ausdrucks), welches eine beliebige Anzahl von Argumenten
annehmen kann. Die Argumente werden in der Makro-Variablen mit
Namen var (einer Zeichenkette)
während der Evaluierung des Rumpfes, body,
gespeichert. Der Wert des i-ten Arguments kann dann mit
<
Dieses Konstrukt evaluiert ein Baum, dessen Wurzel root ist und dessen Kinder durch Anwendung eines Makros foo auf die Kinder des Makro-Arguments mit Namen var entstehen.
Entsprechend der Vorgabe wird foo auf auf alle Kinder angewandt. Wenn first spezifiziert wurde, dann wird mit dem i-ten Kind begonnen, wenn i das Resultat der Evaluierung von first ist. Mit last wird die Berechnung beim j-ten Kind von var, wobei das j-te Kind nicht einbezogen wird, wenn j das Ergebnis der Evaluierung von last ist. Die Dimension des Baumes ist also j - i.
Anders ausgedrückt:
Das
<assign|comma-extra|<macro|x|, x>>
<
assign
|
comma-separated
|
<
xmacro
|
args
|
<\concat|
<arg|args|0>
<map-args|comma-extra|concat|args|1>
Dieses Konstrukt evaluiert zu einem Baum mit dem dem gleichen Label wie die Expansion des Arguments var, dessen Unter-Bäume das Resultat der Evaluierung der Unter-Bäume von var sind.
Dieses Konstrukt ist besonders nützlich, wenn es darum
geht, Makros zu expandieren, die selbst das Ergebnis einer
Berechnung sind: Er wendet das Makro, welches das Resultat der
Evaluierung von foo ist, auf die
Argumente arg-1 bis arg-n
an.
Allerdings kann in der derzeitigen Implementierung foo entweder zu einem Makro evaluieren oder zu einer Zeichenkette, die dann dem Makro ihren Namen gibt. Wir empfehlen Vorsicht bei der zweiten Variante.
Im unten stehenden Code erwartet <
<
assign
|
filter
|
<
macro
|
pred
|
t
|
<\if|
<equal|<length|t>|0>
<tuple>
<\merge|
<\if|
<compound|pred|<look-up|t|0>>
<tuple|<look-up|t|0>>
<tuple>
<filter|pred|<range|t|1|<length|t>>>
Das lässt sich z.B. in einem Makro <
<assign|evens|<macro|t|<filter|<macro|x|<equal|<mod|x|2>|0>>|t>>>
Die Dimension und die Erreichbarkeit von Kindern wird
normalerweise heuristisch ermittelt. Das
Gibt den Label des Baumes zurück, wenn der Ausdruck, expression, evaluiert wird.
Gibt die Dimension des Baumes zurück, wenn der Ausdruck, expression, evaluiert wird.