Skip to main content

Insert

rascal-0.34.0

Synopsis

Insert a value in a tree during a Visit.

Syntax

insert Exp;

Description

An insert statement may only occur in the action part of a Pattern With Action, more precisely in a case in a Visit expression. The value matched by the pattern of this case is replaced by the value of Exp.

The following rule applies:

  • The static type of Exp should be a subtype of the type of the value that is replaced.

Examples

Consider the following datatype CTree and assign a CTree value to variable T:

rascal>data CTree = leaf(int n) | red(CTree left, CTree right) | green(CTree left, CTree right);
ok
rascal>CTree T = red(green(leaf(1), red(leaf(2), leaf(3))), red(leaf(4), leaf(5)));
CTree: red(
green(
leaf(1),
red(
leaf(2),
leaf(3))),
red(
leaf(4),
leaf(5)))

We can now switch the arguments of all red nodes as follows:

rascal>visit(T){
>>>>>>> case red(CTree l, CTree r): insert red(r,l);
>>>>>>>}
CTree: red(
red(
leaf(5),
leaf(4)),
green(
leaf(1),
red(
leaf(3),
leaf(2))))

Since this is a very common idiom, we also have a shorthand for it:

rascal>visit(T){
>>>>>>> case red(CTree l, CTree r) => red(r,l)
>>>>>>>}
CTree: red(
red(
leaf(5),
leaf(4)),
green(
leaf(1),
red(
leaf(3),
leaf(2))))

Pitfalls

There is a glitch in the Rascal syntax that requires a semicolon after a case (as in the first example), but refuses it in the abbreviated version using => (the second example).