From this revision Groups may have types. A type can be used to restrict the parameter list to specific objects. Also in a method of object not only has in scope own privates members but also form those objects with the same type(s) (all types must be the same) which passed to method, private variables act as public.
Report {
Tree traversal
1
/ \
/ \
/ \
2 3
/ \ /
4 5 6
/ / \
7 8 9
}
Pen 15 {Report "Using types in class Node"}
Print
Module OOP {
Class Node {
private:
\\ Pointer() of Pointer(0) is the Null type pointer
x, LeftNode=Pointer(), RightNode=Pointer()
Public:
Module preorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
call visitor(T=>x)
printtree(T=>LeftNode)
printtree(T=>RightNode)
end sub
}
Module inorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
call visitor(T=>x)
printtree(T=>RightNode)
end sub
}
Module postorder (visitor) {
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
printtree(T=>RightNode)
call visitor(T=>x)
end sub
}
Module level_order (visitor){
M=stack:= Pointer(This)
\\ using M as FIFO
Stack M {
if empty then exit
Read T
if T is type Node Then
call visitor(T=>x)
Data T=>LeftNode, T=>RightNode
end if
Loop
}
}
remove {
print format$("node {0} destroyed", .x)
}
Class:
Module Node {
Read .x, .LeftNode, .RightNode
}
}
\\ Function NodeTree return a pointer to a new Node
Function NodeTree {
\\ ![] pass currrent stack to Node()
->Node(![])
}
\\ Tree is type Node
Tree=NodeTree(1, NodeTree(2,NodeTree(4, NodeTree(7)), NodeTree(5)), NodeTree(3, NodeTree(6, NodeTree(8), NodeTree(9))))
printnum=lambda (title$) -> {
Print
Print title$;
=lambda (x)-> {
Print x;" ";
}
}
Tree=>preorder printnum("preorder: ")
Tree=>inorder printnum("inorder: ")
Tree=>postorder printnum("postorder: ")
Tree=>level_order printnum("level-order: ")
Print
Print
}
OOP
Pen 15 {Report "Using types and inheritance: a class Tree as a class Node, which returns a pointer to Tree object"}
Print
Module OOP {
Class Node {
private:
\\ Pointer() of Pointer(0) is the Null type pointer
x, LeftNode=Pointer(), RightNode=Pointer()
Public:
Module preorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
call visitor(T=>x)
printtree(T=>LeftNode)
printtree(T=>RightNode)
end sub
}
Module inorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
call visitor(T=>x)
printtree(T=>RightNode)
end sub
}
Module postorder (visitor) {
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
printtree(T=>RightNode)
call visitor(T=>x)
end sub
}
Module level_order (visitor){
M=stack:= Pointer(This)
\\ using M as FIFO
Stack M {
if empty then exit
Read T
if T is type Null Else
call visitor(T=>x)
Data T=>LeftNode, T=>RightNode
end if
Loop
}
}
remove {
print format$("node {0} destroyed", .x)
}
}
Class Tree as Node {
value (xval) {
.LeftNode<=Pointer()
.RightNode<=Pointer()
Read ? .LeftNode, .RightNode
.x<=xval
->(This)
}
}
\\ now NodeTree is a static group with value which generate other trees.
\\ Tree is type Tree
NodeTree=Tree()
Tree=NodeTree(1, NodeTree(2,NodeTree(4, NodeTree(7)), NodeTree(5)), NodeTree(3, NodeTree(6, NodeTree(8), NodeTree(9))))
printnum=lambda (title$) -> {
Print
Print title$;
=lambda (x)-> {
Print x;" ";
}
}
Tree=>preorder printnum("preorder: ")
Tree=>inorder printnum("inorder: ")
Tree=>postorder printnum("postorder: ")
Tree=>level_order printnum("level-order: ")
Print
Print
}
OOP
Pen 15 {Report "Using types and inner class Node in a class Tree which returns a pointer to Node object"}
Print
Module OOP {
Class Tree {
Private:
Class Node {
private:
\\ Pointer() of Pointer(0) is the Null type pointer
x, LeftNode=Pointer(), RightNode=Pointer()
Public:
Module preorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
call visitor(T=>x)
printtree(T=>LeftNode)
printtree(T=>RightNode)
end sub
}
Module inorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
call visitor(T=>x)
printtree(T=>RightNode)
end sub
}
Module postorder (visitor) {
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
printtree(T=>RightNode)
call visitor(T=>x)
end sub
}
Module level_order (visitor){
M=stack:= Pointer(This)
\\ using M as FIFO
Stack M {
if empty then exit
Read T
if T is type Node Then
call visitor(T=>x)
Data T=>LeftNode, T=>RightNode
end if
Loop
}
}
remove {
print format$("node {0} destroyed", .x)
}
Class:
Module Node {
Read .x, .LeftNode, .RightNode
}
}
public:
value (xval as double) {
Rem {
LeftNode=Pointer()
RightNode=Pointer()
Read ? LeftNode, RightNode
->.Node(xval,LeftNode, RightNode)
}
->.Node(xval,![])
}
}
\\ now NodeTree is a static group with a private Node class
\\ return a pointer to a Node object
\\ Tree is type Node
NodeTree=Tree()
Tree=NodeTree(1, NodeTree(2,NodeTree(4, NodeTree(7)), NodeTree(5)), NodeTree(3, NodeTree(6, NodeTree(8), NodeTree(9))))
printnum=lambda (title$) -> {
Print
Print title$;
=lambda (x)-> {
Print x;" ";
}
}
Tree=>preorder printnum("preorder: ")
Tree=>inorder printnum("inorder: ")
Tree=>postorder printnum("postorder: ")
Tree=>level_order printnum("level-order: ")
Print
Print
}
OOP
In the following example there are two modules which have same output. One module use named groups (a kind of static and passing by reference (see: &a as alfa ), and the other use pointers to groups and passing by pointer, (see: a as *alfa).
All classes make types automatic. Groups can be use types, or not. Merging a not typed group add functionality without changing the type.
module UsingNamedObjects {
\\ private members used as public inside a method
\\ for any object.
class alfa {
private:
dim a()
public:
module changethis (&p as alfa) {
\\ m is a pointer to array (mArray object)
\\ p.a() not work outside an alfa type method
m=p.a()
\\ pointer to arrays have some operators
m+=10
Print type$(m)
}
module PrintMe {
\\ we can use .a() or this.a()
print this.a()
}
Remove {
Print "alfa type object deleted"
}
class:
module alfa (n) {
\\ redim array
dim .a(10)=n
}
}
b=alfa(3)
c=alfa(6)
b.PrintMe
c.PrintMe
\\ So now we pass pointer c to b.changethis
b.changethis &b
b.changethis &c
b.PrintMe
c.PrintMe
\\ only manual we can call the remove function for named objects
Clear b, c
}
UsingNamedObjects
module UsingPointersToObjects {
\\ private members used as public inside a method
\\ for any object.
class alfa {
private:
dim a()
public:
module changethis (p as *alfa) {
\\ m is a pointer to array (mArray object)
\\ p=>a() not work outside an alfa type method
m=p=>a()
\\ pointer to arrays have some operators
m+=10
Print type$(m)
}
module PrintMe {
\\ we can use .a() or this.a()
print this.a()
}
Remove {
Print "alfa type object deleted"
}
class:
module alfa (n) {
\\ redim array
dim .a(10)=n
}
}
b->alfa(3)
c->alfa(6)
b=>PrintMe
c=>PrintMe
\\ So now we pass pointer c to b.changethis
b=>changethis b
b=>changethis c
b=>PrintMe
c=>PrintMe
\\ now b and c erased
\\ and because no other pointers hold the objects, destroyed.
\\ so the remove function call automatic
}
UsingPointersToObjects
\\ private members used as public inside a method
\\ for any object.
class alfa {
private:
dim a()
public:
module changethis (&p as alfa) {
\\ m is a pointer to array (mArray object)
\\ p.a() not work outside an alfa type method
m=p.a()
\\ pointer to arrays have some operators
m+=10
Print type$(m)
}
module PrintMe {
\\ we can use .a() or this.a()
print this.a()
}
Remove {
Print "alfa type object deleted"
}
class:
module alfa (n) {
\\ redim array
dim .a(10)=n
}
}
b=alfa(3)
c=alfa(6)
b.PrintMe
c.PrintMe
\\ So now we pass pointer c to b.changethis
b.changethis &b
b.changethis &c
b.PrintMe
c.PrintMe
\\ only manual we can call the remove function for named objects
Clear b, c
}
UsingNamedObjects
module UsingPointersToObjects {
\\ private members used as public inside a method
\\ for any object.
class alfa {
private:
dim a()
public:
module changethis (p as *alfa) {
\\ m is a pointer to array (mArray object)
\\ p=>a() not work outside an alfa type method
m=p=>a()
\\ pointer to arrays have some operators
m+=10
Print type$(m)
}
module PrintMe {
\\ we can use .a() or this.a()
print this.a()
}
Remove {
Print "alfa type object deleted"
}
class:
module alfa (n) {
\\ redim array
dim .a(10)=n
}
}
b->alfa(3)
c->alfa(6)
b=>PrintMe
c=>PrintMe
\\ So now we pass pointer c to b.changethis
b=>changethis b
b=>changethis c
b=>PrintMe
c=>PrintMe
\\ now b and c erased
\\ and because no other pointers hold the objects, destroyed.
\\ so the remove function call automatic
}
UsingPointersToObjects
Bellow is another example with 3 different implementations for same output.
Report {
Tree traversal
1
/ \
/ \
/ \
2 3
/ \ /
4 5 6
/ / \
7 8 9
}
Pen 15 {Report "Using types in class Node"}
Module OOP {
Class Node {
private:
\\ Pointer() of Pointer(0) is the Null type pointer
x, LeftNode=Pointer(), RightNode=Pointer()
Public:
Module preorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
call visitor(T=>x)
printtree(T=>LeftNode)
printtree(T=>RightNode)
end sub
}
Module inorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
call visitor(T=>x)
printtree(T=>RightNode)
end sub
}
Module postorder (visitor) {
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
printtree(T=>RightNode)
call visitor(T=>x)
end sub
}
Module level_order (visitor){
M=stack:= Pointer(This)
\\ using M as FIFO
Stack M {
if empty then exit
Read T
if T is type Node Then
call visitor(T=>x)
Data T=>LeftNode, T=>RightNode
end if
Loop
}
}
remove {
print format$("node {0} destroyed", .x)
}
Class:
Module Node {
Read .x, .LeftNode, .RightNode
}
}
\\ Function NodeTree return a pointer to a new Node
Function NodeTree {
\\ ![] pass currrent stack to Node()
->Node(![])
}
\\ Tree is type Node
Tree=NodeTree(1, NodeTree(2,NodeTree(4, NodeTree(7)), NodeTree(5)), NodeTree(3, NodeTree(6, NodeTree(8), NodeTree(9))))
printnum=lambda (title$) -> {
Print title$;
=lambda (x)-> {
Print x;" ";
}
}
Tree=>preorder printnum("preorder: ")
Tree=>inorder printnum("inorder: ")
Tree=>postorder printnum("postorder: ")
Tree=>level_order printnum("level-order: ")
}
OOP
Pen 15 {Report "Using types and inheritance: a class Tree as a class Node, which returns a pointer to Tree object"}
Module OOP {
Class Node {
private:
\\ Pointer() of Pointer(0) is the Null type pointer
x, LeftNode=Pointer(), RightNode=Pointer()
Public:
Module preorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
call visitor(T=>x)
printtree(T=>LeftNode)
printtree(T=>RightNode)
end sub
}
Module inorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
call visitor(T=>x)
printtree(T=>RightNode)
end sub
}
Module postorder (visitor) {
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
printtree(T=>RightNode)
call visitor(T=>x)
end sub
}
Module level_order (visitor){
M=stack:= Pointer(This)
\\ using M as FIFO
Stack M {
if empty then exit
Read T
if T is type Null Else
call visitor(T=>x)
Data T=>LeftNode, T=>RightNode
end if
Loop
}
}
remove {
print format$("node {0} destroyed", .x)
}
}
Class Tree as Node {
value (xval) {
.LeftNode<=Pointer()
.RightNode<=Pointer()
Read ? .LeftNode, .RightNode
.x<=xval
->(This)
}
}
\\ now NodeTree is a static group with value which generate other trees.
\\ Tree is type Tree
NodeTree=Tree()
Tree=NodeTree(1, NodeTree(2,NodeTree(4, NodeTree(7)), NodeTree(5)), NodeTree(3, NodeTree(6, NodeTree(8), NodeTree(9))))
printnum=lambda (title$) -> {
Print title$;
=lambda (x)-> {
Print x;" ";
}
}
Tree=>preorder printnum("preorder: ")
Tree=>inorder printnum("inorder: ")
Tree=>postorder printnum("postorder: ")
Tree=>level_order printnum("level-order: ")
}
OOP
Pen 15 {Report "Using types and inner class Node in a class Tree which returns a pointer to Node object"}
Module OOP {
Class Tree {
Private:
Class Node {
private:
\\ Pointer() of Pointer(0) is the Null type pointer
x, LeftNode=Pointer(), RightNode=Pointer()
Public:
Module preorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
call visitor(T=>x)
printtree(T=>LeftNode)
printtree(T=>RightNode)
end sub
}
Module inorder (visitor){
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
call visitor(T=>x)
printtree(T=>RightNode)
end sub
}
Module postorder (visitor) {
T->This
printtree(T)
sub printtree(T)
If T is type Null Then Exit sub
printtree(T=>LeftNode)
printtree(T=>RightNode)
call visitor(T=>x)
end sub
}
Module level_order (visitor){
M=stack:= Pointer(This)
\\ using M as FIFO
Stack M {
if empty then exit
Read T
if T is type Node Then
call visitor(T=>x)
Data T=>LeftNode, T=>RightNode
end if
Loop
}
}
remove {
print format$("node {0} destroyed", .x)
}
Class:
Module Node {
Read .x, .LeftNode, .RightNode
}
}
public:
value (xval as double) {
Rem {
LeftNode=Pointer()
RightNode=Pointer()
Read ? LeftNode, RightNode
->.Node(xval,LeftNode, RightNode)
}
->.Node(xval,![])
}
}
\\ now NodeTree is a static group with a private Node class
\\ return a pointer to a Node object
\\ Tree is type Node
NodeTree=Tree()
Tree=NodeTree(1, NodeTree(2,NodeTree(4, NodeTree(7)), NodeTree(5)), NodeTree(3, NodeTree(6, NodeTree(8), NodeTree(9))))
printnum=lambda (title$) -> {
Print title$;
=lambda (x)-> {
Print x;" ";
}
}
Tree=>preorder printnum("preorder: ")
Tree=>inorder printnum("inorder: ")
Tree=>postorder printnum("postorder: ")
Tree=>level_order printnum("level-order: ")
}
OOP