On Thu, Apr 5, 2012 at 01:53, Sutherland, Julian <julian.sutherland10@imperial.ac.uk> wrote:
data Tree = Node Left Right | Leaf
Could be converted to a struct in C/C++:
struct Tree {
struct Tree* left;
struct Tree* right;
};
Shouldn't this actually be a tagged union? Not that they exist as such in C/C++, but are easy enough to emulate (minus the extra type checking that real tagged unions such as even Pascal gives you):
struct Tree {
enum {Node, Leaf} tag;
/* possibly tag sanity checking macros defined here */
union {
struct {
struct Tree *tree_Node_left;
#ifdef HSC_CHECKED
# define tree_left(tree) (tree->tag == Leaf ? _hsc_abort("tree: Node.left of Leaf") : tree->_tree_Node.tree_Node_left)
#else
# define tree_left(tree) tree->_tree_Node.tree_Node_left
#endif
struct Tree *tree_Node_right;
#ifdef HSC_CHECKED
# define tree_right(tree) (tree->tag == Leaf ? _hsc_abort("tree: Node.right of Leaf") : tree->_tree_Node.tree_Node_right)
#else
# define tree_right(tree) tree->_tree_Node.tree_Node_right
#endif
} _tree_Node;
/* strictly we can collapse out the union here because Leaf has no data */
} _tree_data;
Similarly several of your other examples could use a bit more thought.
--
brandon s allbery
allbery.b@gmail.com
wandering unix systems administrator (available) (412) 475-9364 vm/sms