|
Fundamental tree modification routines |
|
From an internal point of view, all modifications to the TeXmacs edit
tree are decomposed into atomic modifications of eight different
types. In this section, we describe the Scheme
interface to these fundamental modification routines. Even though it
is usually more convenient to use higher level modification routines,
as described in the next section, the fundamental tree
modification routines may occasionally be useful as well.
It should be emphasized that the fundamental tree modification
routines are not checked for their correctness. It is the
responsability of the user to verify that the operations are valid and
that they lead to a correct new edit tree. Although it is sometimes
possible to leave the edit tree in a temporarily incorrect or
“unsimplified” state (for instance, by allowing subtrees
of the form (concat "")), this practice is not generally
recommended, and may lead to severe bugs.
(tree-assign! var new-value)
(tree assignment)
On input, we have a Scheme variable var of
type tree and new-value of type content.
The macro replaces the tree by new-value and updates var
accordingly. The new tree value of var is returned.
(tree-insert! var pos ins)
(insertion of new nodes or characters)
The first parameter var is a Scheme variable
of type tree. If var is a compound tree, then ins
should be a list
u0,…,ul -
1 of new children of type content. In that
case, the routine inserts
u0,…,ul -
1 into the children of var, at position pos (see figure ?). If var is a string tree, then ins should be of
string content type, and the string ins is inserted into var at
position pos. The variable var is updated with the result of the
insertion and the result is returned.
(tree-remove! var pos nr)
(removal of nodes or characters)
The first parameter var is a Scheme variable
of type tree. If var is a compound tree, then nr
of its children are removed, starting at position pos (see figure
?). If var is a string tree, then nr characters are
removed, starting at position pos. The variable var is updated
with the result of the removal and the result is returned.
|
|
Figure 1. Illustration of the
operations (tree-insert! t i u) and (tree-remove! t i l). If u
has length l, then we notice that (tree-remove! t i l) undos the
insertion (tree-insert! t i u).
|
(tree-split! var pos at)
(split the children into two parts)
The first parameter var is a Scheme variable
of type tree. The macro is used to split the child
u of var at position pos into two parts. If
u is a compound tree, then the first part consists of
the first at children and the second part of the remaining ones.
Both parts carry the same label as u and u
is replaced by the two parts inside var (see figure ?).
If u is string tree, then it is rather split into two
strings at position at. The variable var is updated with the
result of the split command and the result is returned.
(tree-join! var pos)
(join two adjacent nodes)
The first parameter var is a Scheme variable
of type tree. This macro is used to join the child
u of var at position pos with the child v at
position pos+1. If u and v are trees, then
they are removed from var and replaced by a single tree which has
the same label as u and whose children are those of
u, followed by the children of v (see figure
?). If u and v are strings,
then they are replaced by their concatenation. The variable var is
updated with the result of the join command and the result is
returned.
|
|
Figure 2. Illustration of the
operations (tree-split! t i j) and (tree-join! t i). Notice that
(tree-join! t i) undos (tree-split! t i j).
|
(tree-assign-node! var lab)
(assign the label of a tree)
This macro replaces the label of a compound tree stored in a
Scheme variable var by a new value lab. The
result of the substitution is returned.
(tree-insert-node! var pos ins)
(insert the tree as a child of another
one)
Given a Scheme variable var, containing a
tree, and a content tree ins, this macro replaces var by ins, with
var inserted as a new child of ins at position pos (see figure ?). The result of the insertion is returned.
(tree-remove-node! var pos)
(replace a tree by a child)
Given a Scheme variable var, containing a
compound tree, this macro replaces var by its child at position
pos (see figure ?). The value of this child is
returned.
|
|
Figure 3. Illustration of the
operations (tree-insert-node! t i u) and (tree-remove-node! t
i). Notice that the second operation undos the first one.
|
Remark 1. Each of the macros tree-assign!,
tree-insert!, etc. has a functional counterpart tree-assign, tree-insert, etc. The first
parameter of these counterparts can be an arbitrary
“l-value” and does not have to be a scheme variable.
However, in the case when a Scheme variable is
passed as the first parameter, these variants do not necessarily
update its contents with the return value.
© 2005 Joris van der Hoeven
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".