Какова цель переменных результата в Фортране?

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

function foo()
    integer :: foo

    foo = 10
end function foo

Вторая форма, стандартизированная в Fortran 90, представляет собой переменную «результат».

function foo result(res)
    integer :: res

    res = 10
 end function foo

Вызов любой формы функции возвращает значение 10. Мой вопрос: каково было обоснование комитета Fortran 90 для введения переменных результата? Они стандартизировали обычную практику? Или они позволяли программам быть более модульными, не привязывая имя функции к результату функции. Например, во второй версии foo() имя функции foo() можно было изменить на bar(), и при вызове функция по-прежнему работала должным образом.

Впрочем, я могу ошибаться. Кто-нибудь знает, каково было фактическое обоснование введения переменных результата?


person Giorgian Borca-Tasciuc    schedule 25.06.2015    source источник
comment
Обратите внимание: если вы просто хотите изменить имя функции, вам не нужно менять тело, если вы используете результат, так что это более удобно.   -  person Anthony Scemama    schedule 26.06.2015
comment
@AnthonyScemama Да, кажется, я упомянул об этом в вопросе.   -  person Giorgian Borca-Tasciuc    schedule 26.06.2015


Ответы (1)


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

Результат функции всегда возвращается через переменную результата, независимо от того, используется ли result или нет.1 С result переменная результата имеет указанное имя, а без него переменная результата имеет то же имя, что и функция. В этом последнем случае использование имени является ссылкой на переменную результата, а не на функцию.

Итак, если функция foo имеет результирующую переменную foo, то мы не можем выполнить прямую рекурсию:

recursive function foo(n)
  foo = foo(n-1) ! Oh dear
end function

result происходит так, что мы можем иметь

recursive function foo(n) result(res)
  res = foo(n-1) ! Yay
end function

[1] Так было до Фортрана 2008, когда изменилось определение переменной. Для современного Фортрана вместо этого используйте термин результат функции.

person francescalus    schedule 25.06.2015
comment
Так это в основном для рекурсивной функции? - person Herman Toothrot; 06.04.2020
comment
Это необходимо для разрешения рекурсивных функций, но также полезно для предоставления более удобного имени внутри определения функции: function long_and_descriptive_function_name () result(res). - person francescalus; 06.04.2020