We saw in the previous paragraph that functions can be used, and that they can have parameter. 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