Module OOP { \\ Class is a global function (until this module end) Class Null { } \\ Null is a pointer to an object returned from class Null() Global Null->Null() Class Node { Public: x, Group LeftNode, Group RightNode Module preorder (visitor){ T->This printtree(T) sub printtree(T as pointer) If T is Null then Exit sub call event visitor, T=>x printtree(T=>LeftNode) printtree(T=>RightNode) end sub } Module inorder (visitor){ T->This printtree(T) sub printtree(T as pointer) If T is Null then Exit sub printtree(T=>LeftNode) call event visitor, T=>x printtree(T=>RightNode) end sub } Module postorder (visitor) { T->This printtree(T) sub printtree(T as pointer) If T is Null then Exit sub printtree(T=>LeftNode) printtree(T=>RightNode) call event visitor, T=>x end sub } Module level_order (visitor){ T->This Stack New { printtree(T) if empty then exit Read T Loop } sub printtree(T as pointer) If T is Null else call event visitor, T=>x Data T=>LeftNode, T=>RightNode end if end sub } Class: \\ after class: anything exist one time, \\ not included in final object Module Node { .LeftNode<=Null .RightNode<=Null Read .x \\ read ? for optional values Read ? .LeftNode, .RightNode } } \\ NodeTree return a pointer to a new Node Function NodeTree { \\ ![] pass currrent stack to Node() ->Node(![]) } Tree=NodeTree(1, NodeTree(2,NodeTree(4, NodeTree(7)), NodeTree(5)), NodeTree(3, NodeTree(6, NodeTree(8), NodeTree(9)))) Event PrintAnum { read x } Function PrintThis(x) { Print x;" "; } Event PrintAnum New PrintThis() printnum=lambda PrintAnum (title$) -> { Print Print title$; =PrintAnum } Tree=>preorder printnum("preorder: ") Tree=>inorder printnum("inorder: ") Tree=>postorder printnum("postorder: ") Tree=>level_order printnum("level-order: ") } OOP