We saw in the previous paragraph that functions can be used, and that they can have parameters. This forces us to clarify scope.
/scope.lm
str d (where:str) {
print( "in D ", where, "\n")
where = "d"
print( "in D ", where, "\n")
}
str c ( ) {
print( "in C ", where_g, "\n")
where_g = "c"
print( "in C ", where_g, "\n")
}
str b ( where:str ) {
print( "in B ", where, "\n")
where = "b"
print( "in B ", where, "\n")
}
str a( where:str ) {
print( "in A ", where, "\n")
where = "a"
b( where )
print( "in A ", where, "\n")
}
where: str = "global"
print( "in global ", where, "\n")
a( where )
print( "in global ", where, "\n")
global where_g:str
c( )
print( "in global ", where_g, "\n")
We run it with
/opt/colm/bin/colm scope.lm
./scope
That gives us:
in global global in A global in B a in B b in A a in global global in C NIL in C c in global c
The thesis also mentions that variables can be passed by reference instead of by value.
nested_scope.lm
str a( where:str ) {
print( "before block1 ", where, "\n" )
while(true) {
where = "block1"
print( "in block1 ", where, "\n" )
i:int = 0
while( true ) {
where = where + "a"
print( "in loop ", where, "\n" )
break
}
print( "in block1 ", where, "\n" )
break
}
print( "in A ", where, "\n" )
return where
}
where: str = "global"
print( "in global ", where, "\n" )
a( where )
print( "in global ", where, "\n" )
That gives us:
in global global in A global in B a in B b in A a in global global in C NIL in C c in global c
/opt/colm/bin/colm nested_scope.lm
./nested_scope
It seems that this is still the case.
in global global before block1 global in block1 block1 in loop block1a in block1 block1a in A block1a in global global