


The simplest syntax for defining a package looks like:
package binary_tree {
Binary_Tree
= LEAF
| NODE { key: Float,
left_kid: Binary_Tree,
right_kid: Binary_Tree
}
;
fun print_tree LEAF
=>
();
print_tree (NODE { key, left_kid, right_kid })
=>
{ print "(";
print_tree left_kid;
printf "%2.1f" key;
print_tree right_kid;
print ")";
};
end;
};
Here the reserved word package introduces the package name binary_tree, while the curly braces delimit the scope of the package, which in this case exports one type, Binary_Tree and one function, print_tree.
Other packages may then make such references as
binary_tree::Binary_Tree
binary_tree::LEAF
binary_tree::NODE
binary_tree::print_tree
in the course of making use of the functionality so implemented.
Since binary_tree is a fairly long name, another package might well define a shorter synonym for local use by doing
package tree = binary_tree;
after which it could instead refer to
tree::Binary_Tree
tree::LEAF
tree::NODE
tree::print_tree
Alternatively, if it is a small package working heavily with binary trees, it might simply import everything from package binary_tree wholesale into its own namespace by doing
include binary_tree;
after which it could simply refer to
Binary_Tree
LEAF
NODE
print_tree
just as though they had been locally defined.


