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 drd-props gesteuert werden.

<macro|var-1||var-n|body>
(Makro mit festgelegter Argumentanzahl)

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, aber manchmal ist es besser, einem Tag lokal zu definieren mit with. Beispielsweise definieren nummerierte Kontexte die Variable item lokal.

Beispiel 1. Definition einer Abkürzung

<assign|Abkürzung|<macro|x|<group|x>>>

Wenn man ein Makro macro im Kontext speichert, wird ein Tag mit einer vorgegebenen Anzahl von Argumenten definiert.

<arg|var|index-1||index-n>
(Makro-Argumente ermitteln)

Dieses Konstrukt dient dazu, Werte von Variablen innerhalb eines Makro-Rumpfes zu ermitteln. Z.B. evaluiert <arg|var> zu dem aktuellen Wert von var (Zeichenkette). Natürlich muss dieses Argument davor in dem Makro, macro, definiert sein, das den arg-Konstrukt enthält.

Dieses Konstrukt ähnelt value, verhält sich aber in einigen wichtigen Punkten anders:

Wenn mehr als Argument vorhanden ist, dann expandiert <arg|var|index-1||index-n> zu einem Unterbaus des Arguments var. Der Wert von var muss ein unbenanntes Makro, compound, sein, also keine Zeichenkette. Alle Argumente, var bis index-n, müssen zu positiven Ganzzahlen evaluieren und den Pfad zu einem Unterbaus des Makro-Arguments zeigen.

<xmacro|var|body>
(Makro mit beliebiger Argumentanzahl)

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 <arg|var|i> erhalten werden.

<map-args|foo|root|var>

<map-args|foo|root|var|first>

<map-args|foo|root|var|first|last>
(ein Makro auf alle Kinder eines Baums anwenden)

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: map-args wendet foo auf alle Unter-Bäume oder auf ein Intervall von Unter-Bäumen an (falls first und last angegeben wurde) und sammelt das Ergebnis in einem Baum mit Namen root.

map-args ist das Analogon zur Scheme-Funktion map. Weil TeXmacs aber Bäume mit Labeln verwendet, muss das Label für das Ergebnis mit übergeben werden.

Beispiel 2. Komma-separierte Listen.

Das comma-separated-Makro hat eine Dimension, auch wenn dies keinen Sinn macht bei der Dimension 0. Der Schriftsatz erfolgt so, dass seine Argumente durch Kommata getrennt werden.

<assign|comma-extra|<macro|x|, x>>

< assign | comma-separated | < xmacro | args |

<\concat|

<arg|args|0>

|

<map-args|comma-extra|concat|args|1>

>

> >

<eval-args|var>
(Makro mit beliebiger Dimension)

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.

<compound|foo|arg-1||arg-n>
(unbenanntes Makro)

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. compound wird vor allem verwendet, wenn einem Makro ein anderes Makro als Argument übergeben wird, welches es dann beim Vorliegen bestimmter Bedingungen verwendet.

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.

Beispiel 3. Lambda-Programmierung mit Makros.

Im unten stehenden Code erwartet <filter|pred|t> ein Makro pred und ein Tupel t als Argumente und liefert ein Tupel zurück, das aus denjenigen Elemente von t besteht, für die pred den Wert true ergibt.

< 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 <evens|t> verwenden, das aus ein Tupel von Ganzzahlen t die geraden Zahlen extrahiert.

<assign|evens|<macro|t|<filter|<macro|x|<equal|<mod|x|2>|0>>|t>>>

<drd-props|var|prop-1|val-1||prop-n|val-n>
(setze D.R.D.-Eigenschaften)

Die Dimension und die Erreichbarkeit von Kindern wird normalerweise heuristisch ermittelt. Das drd-props-Konstrukt ändert die Voreinstellung für die Kontextvariable (normalerweise ein Makro) mit dem Namen var. Zur Zeit werden die folgenden Paarungen unterstützt:

(arity, n)
(Dimension, n) setzt die Dimension auf einen festen Wert n (Ganzzahl).
(accessible, all)
(erreichbar, alle) Das Konstrukt kann dann im Editor nicht deaktiviert werden. Kinder, die nicht erreichbar sind, können nicht editiert werden.
(accessible, none)
Verhindert, dass der Cursor innerhalb eines Konstrukts positioniert wird, solange das Konstrukt aktiv ist. Kinder können also nur editiert werden, wenn das Konstrukt deaktiviert wird.

<get-label|expression>
(Label eines Ausdrucks)

Gibt den Label des Baumes zurück, wenn der Ausdruck, expression, evaluiert wird.

<get-arity|expression>
(Dimension eines Ausdrucks)

Gibt die Dimension des Baumes zurück, wenn der Ausdruck, expression, evaluiert wird.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".