| (!******************************************************
   Mosel Testing Examples
   ====================== 
   file mynspkg1.mos 
   `````````````````
   Testing namespaces
   - main model: mynstest.mos -
 
   (c) 2018 Fair Isaac Corporation
       author: S. Heipcke, 15 May 2018
*******************************************************!)
package mynspkg1
 namespace ns1, ns3, ns3~ns31         ! This package defines 3 namespaces:
 nsgroup ns1: "mynspkg2"              !  * ns1 + ns3~ns31 restricted to pkg2
 nsgroup ns3~ns31: "mynspkg2"         !  * ns3 is visible to all
 nssearch ns1                         ! 'ns1' can be used without prefix
 declarations
   ns3~R = 1..10
   ns1~Ar: array(ns3~R) of integer    ! Index set in different namespace
   vi, ns3~vi, ns3~ns31~vi: integer   ! 3 different entities
 end-declarations
 public declarations
   vp: integer
 end-declarations
 procedure ns1~proc1(val:integer)     ! Subroutine in a namespace
   ns3~vi:=val; ns3~ns31~vi:=2*val; vi:=val; vp:=val
   Ar(5):=val                         ! No prefix: 'ns1' is in search list
   writeln(" In ns1~proc1: ", vi)
 end-procedure
 public procedure proc2(val:integer)  ! Public subroutine
   writeln(" In proc2: ", val)
 end-procedure 
 procedure proc3(val:integer)         ! Private subroutine
   writeln(" In proc3: ", val)
 end-procedure 
end-package
 | 
| (!******************************************************
   Mosel Testing Examples
   ====================== 
   file mynspkg2.mos 
   `````````````````
   Testing namespaces
   - main model: mynstest.mos -
 
   (c) 2018 Fair Isaac Corporation
       author: S. Heipcke, 15 May 2018
*******************************************************!)
package mynspkg2
 uses 'mynspkg1'
 namespace ns3~ns31                   ! Namespace used in this package
 nssearch ns1                         ! 'ns1' can be used without prefix
 public procedure frompkg2(val: integer)
   proc1(val)                         ! Procedure in namespace 'ns1'
   writeln("  frompkg2:",ns3~ns31~vi) ! Namespace 'ns3~ns31' is not searched
!   writeln("  vi=", vi)              ! This fails: private symbol of pkg1
   writeln("  vp=", vp)               ! Public symbol of pkg1
   writeln("  Ar(5)=", Ar(5))         ! Contained in 'ns1' (prefix optional)
 end-procedure
end-package
 | 
| (!******************************************************
   Mosel Testing Examples
   ====================== 
   file myns_test.mos 
   ``````````````````
   Testing namespaces
   *** Compile mynspkg1.mos and mynspkg2.mos before running this model ****
   (c) 2018 Fair Isaac Corporation
       author: S. Heipcke, Sep. 2018
*******************************************************!)
model "mynstest"
 uses 'mynspkg1', 'mynspkg2'
! namespace ns1    ! Goes wrong (compilation): ns1 is restricted to pkg1+pkg2
 namespace ns2     ! A new namespace
 nssearch ns3      ! Symbols from 'ns3' can be used without prefix
 declarations
   ns2~vi: integer
   I, ns2~R: range
!   vi: integer    ! Goes wrong at runtime: clash with ns3~vi through nssearch
 end-declarations
 writeln("****Subroutine calls")
 frompkg2(5)                           ! Public routine from package pkg2
 writeln("n3~vi:",vi, " vp:",vp)       ! Display values of n3~vi and vp
! ns1~proc1(10)    ! Goes wrong (compilation): ns1 is restricted to pkg1+pkg2
 proc2(4)          ! This works: public subroutine from pkg1
! proc3(6)         ! Goes wrong (compilation): private subroutine of pkg1
 ! Store and display contents of namespace 'ns3'
 writeln("****Contents of ns3:")
 initializations to "tee:mem:mynsav&"
   ns3
 end-initializations
 ! Initialize entities with matching names from saved namespace
 writeln("****Values read:")
 initializations from "mem:mynsav"
   ns2 as "ns3"
!   I as "ns3~R"
 end-initializations
 writeln("ns2~vi:", ns2~vi)            ! Has received the value of ns3~vi
 ! Read an individual entity from the saved namespace
 initializations from "mem:mynsav"
   I as "ns3~R"
 end-initializations
 writeln("I:", I)  
end-model
 |