Fortran 2003/2008: элегантные аргументы по умолчанию?

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

PROGRAM PDEFAULT 

  CALL SUB
  CALL SUB(3)

CONTAINS 
  SUBROUTINE SUB(VAL)
    INTEGER, OPTIONAL :: VAL
    INTEGER :: AVAL ! short for "actual val"

    IF(PRESENT(VAL)) THEN
       AVAL = VAL
    ELSE 
       AVAL = -1   ! default value 
    END IF

    WRITE(*,'("AVAL is ", I0)') AVAL
  END SUBROUTINE SUB

END PROGRAM PDEFAULT

Лично я часто сталкивался с проблемой случайного набора текстаVAL вместоAVALто есть разъединение между именем переменной в интерфейсе и инициализированным значением, используемым в коде, может привести к ошибкам во время выполнения - не говоря уже о том, что этот способ инициализации довольно многословен.

Есть ли более элегантный способ использования необязательных аргументов со значением по умолчанию?

пример Было бы более естественно написать что-то вроде

IF(NOT(PRESENT(VAL))) VAL = -1 

потому что это избегаетVAL противAVAL спутанность сознания. Но это неверно, предположительно потому, что Фортран передает аргументы по ссылке и, таким образом, еслиVAL нет вCALL оператор, память не связана сVAL а такжеVAL = -1 вызовет сегфо

Ответы на вопрос(4)

Ваш ответ на вопрос