Fortran 2003/2008: argumentos padrão elegantes?

No fortran, podemos definir argumentos padrão. No entanto, se um argumento opcional não estiver presente, ele também não poderá ser definido. Ao usar argumentos como argumentos de palavra-chave com valores padrão, isso leva a construções estranhas como

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

Pessoalmente, muitas vezes encontrei o problema de digitar acidentalmenteVAL ao invés deAVAL, ou seja, a desconexão entre o nome da variável na interface e o valor inicial usado no código pode introduzir erros de tempo de execução - sem falar no fato de que essa maneira de inicialização é bastante detalhada.

Existe alguma maneira mais elegante de usar argumentos opcionais com um valor padrão?

Exemplo Seria mais natural escrever algo como

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

porque evita oVAL vsAVAL confusão. Mas isso não é válido, provavelmente porque o Fortran passa argumentos por referência e, portanto, seVAL não está presente noCALL declaração, nenhuma memória está associada aVAL eVAL = -1 causaria um segfault.

questionAnswers(4)

yourAnswerToTheQuestion