Эмуляция пространств имен в Фортран 90 - PullRequest
10 голосов
/ 06 октября 2010

Одной из самых неприятных проблем с Fortran 90 является отсутствие пространства имен.В этом предыдущем вопросе « Как вы используете данные модуля Fortran 90 » из Пит , обсуждалась основная проблема поведения USE, похожего на «из импорта модуля *» в Python:все, что объявлено общедоступным в модуле, импортируется как есть в рамках модуля импорта.Нет префикса.Это очень и очень трудно понять, читая некоторый код, откуда берется данный идентификатор, и если данный модуль все еще используется или нет.

Возможное решение, обсуждавшееся в вопросе, который я связал выше,использовать ключевое слово ONLY для ограничения импортируемых идентификаторов и документа, откуда они поступают, хотя это очень и очень утомительно, когда модуль очень большой.Сохранение модуля небольшим и всегда использование USE: ТОЛЬКО является потенциально хорошей стратегией для обхода недостатка пространства имен и префиксов квалификации в Fortran 9X.

Существуют ли другие (не обязательно лучшие) обходные стратегии?Говорит ли стандарт Fortran 2k3 о поддержке пространства имен?

Ответы [ 3 ]

6 голосов
/ 06 октября 2010

Для меня это самая раздражающая фортрановская функция, связанная с модулями. Единственное решение - добавить общий префикс к процедурам, переменным, константам и т. Д., Чтобы избежать коллизий пространства имен.

Можно поставить префикс перед всеми сущностями (все публичные сущности кажутся более подходящими) прямо внутри модуля:

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

Последняя небольшая модификация того, что вы, Стефано, предложили.

Даже если мы примем ситуацию с многословием, тот факт, что Fortran не учитывает регистр, вынуждает нас использовать тот же разделитель (_) в именах сущностей. И будет действительно трудно отличить имя модуля (в качестве префикса) от имени объекта, пока мы не будем использовать строгую дисциплину именования, например, имена модулей - это только одно слово.

5 голосов
/ 22 ноября 2011

Имея несколько лет опыта программирования только на Fortran (я попал в Python всего год назад), я некоторое время не знал о такой концепции, как пространства имен.Так что, я думаю, я научился просто отслеживать все импортированные и, как сказал High Performance Mark, использовать ТОЛЬКО столько, сколько у вас есть время (утомительно).

Еще один способ подражатьПространство имен будет объявлять все в модуле как компонент производного типа.Fortran не позволит вам называть модуль так же, как пространство имен, но префикс module_ к имени модуля может быть достаточно интуитивно понятным:

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
3 голосов
/ 06 октября 2010

Fortran 2003 имеет новую конструкцию ASSOCIATE и не забывайте о возможности переименования USE - связанных объектов.Но я не думаю, что что-то из этого намного ближе к обеспечению хорошей эмуляции пространств имен, чем уже есть у Fortran 90, только (немного) лучшие обходные пути.

Как и некоторые респонденты на вопрос, на который вы ссылаетесьЯ склонен думать, что модули с очень большим количеством идентификаторов, вероятно, следует разделить на более мелкие модули (или дождаться Fortran 2008 и использовать подмодули), и в эти дни я почти всегда указываю предложение ONLY (с переименованием) для операторов USE.

Не могу сказать, что сильно скучаю по пространствам имен, но тогда у меня их никогда не было.

...