Description
@FortranFan wrote in #86 (comment):
I have long debated in my own mind whether Fortran should formally introduce the concept of NAMESPACEs or whether MODULEs can themselves be elevated to first-class namespaces. Looking at the proposal at #86 and with #1, I'm presently inclined toward the former.
Whilst I don't quite have a list of the requirements and specifications necessary toward an initial proposal, a sketch of the idea is to include either a new NAMESPACE scope and/or NAMESPACE attribute to MODULEs in addition to PUBLIC/PRIVATE visibility of MODULEs in a NAMESPACE. Then a given NAMESPACE can IMPORT other NAMESPACEs. Fortran can formally define a GLOBAL namespace and state all EXTERNAL MODULEs (a la external procedures) in a program are part of this namespace. The language can then have some rules for name qualification and aliasing. Code then might look like the following with illustrative syntax:
namespace my_lib
public module constants
real, parameter :: PI = 3.14
end module
private module utils !<-- can be USE'd only by modules in the same namespace
interface
module subroutine draw()
end subroutine
end interface
end module
end namespace
namespace my_lib !<-- A namespace can be extended with more modules
public module solver
use constants, only : PI !<-- It can USE modules from the same namespace
contains
function calcradius( a ) result( r )
real, intent(in) :: a
result :: r
r = sqrt(a/PI)
end function
end module
end namespace
namespace global !<- optional, for 'global' namespace will exist by default
import my_lib, only : constants, solver ! import 'public' modules only from another namespace
program p !<-- A program unit can only be part of GLOBAL namespace
use constants, only : PI !<-- does not 'clash' with my_lib::constants
real :: area
print *, "PI = ", PI !<-- PI from USE-associated 'constants' module
area = 100.0
associate ( PI => my_lib::constants%PI, calcrad => my_lib::solver%calcradius )
print *, "circumference = ", 2.0*PI*calcrad(area)
end associate
end program
end namespace
Note the above is based on the use cases in #1 and #86; once more use cases are brought to light, it might help refine the idea of a NAMESPACE.