Namespaces 在Fortran 90中模拟名称空间

Namespaces 在Fortran 90中模拟名称空间,namespaces,fortran,Namespaces,Fortran,Fortran 90最麻烦的问题之一是缺少名称空间。在前面的问题“”中,已经讨论了Python中类似于“from module import*”的用法的主要问题:模块中声明为公共的所有内容都会在导入模块的范围内导入。没有前缀。这使得在阅读一些代码时,很难理解给定标识符来自何处,以及给定模块是否仍在使用 在我上面链接的问题中讨论的一个可能的解决方案是,使用唯一的关键字来限制导入的标识符和它们来自的文档,尽管当模块非常大时,这是非常非常繁琐的。保持模块小,并且始终使用USE:ONLY是解决Fortr

Fortran 90最麻烦的问题之一是缺少名称空间。在前面的问题“”中,已经讨论了Python中类似于“from module import*”的用法的主要问题:模块中声明为公共的所有内容都会在导入模块的范围内导入。没有前缀。这使得在阅读一些代码时,很难理解给定标识符来自何处,以及给定模块是否仍在使用

在我上面链接的问题中讨论的一个可能的解决方案是,使用唯一的关键字来限制导入的标识符和它们来自的文档,尽管当模块非常大时,这是非常非常繁琐的。保持模块小,并且始终使用USE:ONLY是解决Fortran 9X中缺少名称空间和限定前缀的潜在好策略


是否有其他(不一定更好)的变通策略?Fortran 2k3标准对名称空间支持有什么规定吗?

Fortran 2003具有新的
ASSOCIATE
结构,并且不要忘记重命名
使用
关联实体的可能性。但我不认为这两种方法比Fortran 90更接近于提供名称空间的良好模拟,只是(稍微)更好的解决方法

与您链接到的问题的一些回答者一样,我倾向于认为具有很多标识符的模块可能应该被划分为更小的模块(或者,等待Fortran 2008并使用子模块),而现在我几乎总是为
use
语句指定
ONLY
子句(带重命名)


我不能说我很想念名称空间,但是我从来没有真正拥有过名称空间。

对我来说,这是Fortran与模块相关的最恼人的特性。唯一的解决方案是向过程、变量、常量等添加公共前缀,以避免名称空间冲突

可以在模块内部为所有实体(所有公共实体似乎更合适)添加前缀:

module constants

  implicit none

  real, parameter :: constants_pi = 3.14
  real, parameter :: constants_e = 2.71828183

end module constants
缺点是模块内部的代码冗长。例如,作为替代方案,可以使用建议的名称空间前缀包装器模块

module constants_internal

  implicit none

  real, parameter :: pi = 3.14
  real, parameter :: e = 2.71828183

end module constants_internal

module constants

  use constants_internal, only: &
    constants_pi => pi, &
    constants_e => e

end module constants
最后一个是对你Stefano建议的一个小修改


即使我们以冗长的方式接受这种情况,Fortran不是区分大小写的语言这一事实也迫使我们在实体名称中使用相同的分隔符。要区分模块名(作为前缀)和实体名是非常困难的,除非我们不使用强大的命名规则,例如,模块名只有一个词。

有几年的纯Fortran编程经验(我一年前才进入Python),我有一段时间不知道名称空间这样的概念。所以我想我学会了跟踪所有导入的东西,正如High Performance Mark所说的,只要你有时间,就使用它(单调乏味)

我可以想到的另一种模拟命名空间的方法是将模块中的所有内容声明为派生类型组件。Fortran不允许您以与名称空间相同的方式命名模块,但在模块名称前加上module_uuu前缀可能非常直观:

MODULE module_constants
IMPLICIT NONE

TYPE constants_namespace
  REAL :: pi=3.14159
  REAL ::  e=2.71828
ENDTYPE

TYPE(constants_namespace) :: constants

ENDMODULE module_constants


PROGRAM namespaces
USE module_constants
IMPLICIT NONE

WRITE(*,*)constants%pi
WRITE(*,*)constants%e

ENDPROGRAM namespaces

注意:这适用于变量,但不适用于函数。至少可以说,fortran90不支持子程序指针的事实令人震惊。只要有这个小功能,它就可以释放出巨大的可能性。对于子例程,您仍然必须坚持使用..仅,按照kemiisto的建议,使用可选重命名。我想在下一个Fortran标准版本中应该考虑这一点。在Fortran 2003中(当然不是在Fortran 90中),类型绑定过程概念可以用于在函数和子例程前面添加类型名前缀,就像上面为变量所做的那样。但是我不知道这是否会影响性能。如果你的第二段,如果我理解正确,你的意思是,例如
物理常数地球半径
没有说明
物理
是模块名称还是
物理常数
。您可以使用双下划线:
物理常数地球半径
@Matthias009当然可以。但是为了视觉清晰,我更喜欢像
\u mod\u
这样的东西。如果模块中有超过255个实体(255是F2003中最大的续行数),这将如何工作?是否可以将
使用
语句拆分为多个语句?