Могут ли функции Fortran PURE использовать глобальные параметры? - PullRequest
0 голосов
/ 30 ноября 2018

Мне кажется, что то, что называется чистой функцией в Фортране, не считается достаточно чистым для тех, кто использует функциональное программирование.Вот мой вопрос.Предположим, у меня есть следующий код:

MODULE basics
  IMPLICIT NONE
  INTEGER, PARAMETER      :: dp = kind(1.0d0)
  REAL(dp), PARAMETER     :: PI=3.1415926535897932_dp
  REAL(dp), PARAMETER     :: earthEquatorialRadius=6378.137_dp
END MODULE basics

MODULE myFunctions
  USE basics
  IMPLICIT NONE

  PURE REAL(dp) FUNCTION sphericalArc(angleInRadians) 
    REAL(dp),INTENT(IN)  :: angleInRadians 

    sphericalArc= 2.0*PI*earthEquatorialRadius*angleInRadians
  END FUNCTION sphericalArc
END MODULE myFunctions

Функция sphericalArc не имеет побочных эффектов, поэтому она чиста в этом смысле, но использует глобальные константы.Это правда, что параметры PI и earthEquatorialRadius могут быть определены внутри функции, но это нежелательно, так как я хотел бы использовать их в других функциях и подпрограммах.Будет еще более утомительно делать тип dp, определенный в каждой функции или процедуре.

Таким образом, с точки зрения Fortran, это функция, которая использует глобальные параметры, определенные вне функции, все еще считающейся чистой, и может вызываться изсделать параллельный цикл?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Если процедура Fortran (функция или подпрограмма) имеет префикс pure в своем определении, то это чистая процедура в том смысле, что ее использует Fortran.Затем его можно использовать в местах, где существует ограничение чистоты.Процедура с префиксом elemental и без префикса impure также является чистой.

Чтобы иметь возможность указывать ее как чистую, процедура имеет ряд ограничений, но она необходима для компиляторачтобы диагностировать любое нарушение этих ограничений, когда задано pure.

Нет ограничений на то, что именованная константа из другого модуля (или другой области действия) не может ссылаться.

В качестве мотивации дляСтандарт чистоты в Fortran (F2008, примечание 12.49) предлагает:

Приведенные выше ограничения предназначены для гарантии того, что чистая процедура не имеет побочных эффектов (модификации данных, видимых вне процедуры)

Ссылка на именованную константу не является изменением данных, видимых вне процедуры.

0 голосов
/ 30 ноября 2018

Начиная с этой документации можно использовать глобальную переменную, если она parameter (поэтому значение не меняется).

Execution_partи internal_subprogram_part чистой процедуры не может ссылаться на фиктивный аргумент с INTENT (IN), глобальной переменной (или любым объектом, который связан с хранилищем) или любым подобъектом этого в контекстах, которые могут вызвать изменение его значения: чтов контекстах, которые вызывают побочные эффекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...