A workflow can call an internal function, return a derived value, and combine it with local state.

Program

Play the program to choose a request count and watch the call contribute to the final score.

request_count
request_score_workflow.f90
Replay: real traced execution (multi-file project)
program request_score_workflow_demo
    implicit none
    integer :: request_count
    integer :: base_points
    integer :: bonus_points
    integer :: total_points

    request_count = 4
    base_points = 10
    bonus_points = score_bonus(request_count)
    total_points = base_points + bonus_points
    print '(I0, 1X, I0)', request_count, total_points

contains
    function score_bonus(count) result(points)
        integer, intent(in) :: count
        integer :: points
        points = count * 3
    end function score_bonus
end program request_score_workflow_demo
program request_score_workflow_demo
    implicit none
    integer :: request_count
    integer :: base_points
    integer :: bonus_points
    integer :: total_points

    request_count = 2
    base_points = 10
    bonus_points = score_bonus(request_count)
    total_points = base_points + bonus_points
    print '(I0, 1X, I0)', request_count, total_points

contains
    function score_bonus(count) result(points)
        integer, intent(in) :: count
        integer :: points
        points = count * 3
    end function score_bonus
end program request_score_workflow_demo
program request_score_workflow_demo
    implicit none
    integer :: request_count
    integer :: base_points
    integer :: bonus_points
    integer :: total_points

    request_count = 7
    base_points = 10
    bonus_points = score_bonus(request_count)
    total_points = base_points + bonus_points
    print '(I0, 1X, I0)', request_count, total_points

contains
    function score_bonus(count) result(points)
        integer, intent(in) :: count
        integer :: points
        points = count * 3
    end function score_bonus
end program request_score_workflow_demo
  1. request_count ← 4

    8request_count = 49base_points = 10
    values this step4request_count
  2. base_points ← 10

    8request_count = 49base_points = 1010bonus_points = score_bonus(request_count)
    values this step10base_points
  3. bonus_points = score_bonus(request_count)

    9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points
    values this step4request_count
  4. points ← 12

    17    integer :: points18    points = count * 319end function score_bonus
    values this step12points4count
  5. bonus_points ← 12

    9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points
    values this step12bonus_points
  6. total_points ← 22

    10bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_points
    values this step22total_points10base_points12bonus_points
  7. print '(I0, 1X, I0)', request_count, total_points

    11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_points
    output4 22
    values this step4request_count22total_points
  1. request_count ← 2

    8request_count = 29base_points = 10
    values this step2request_count
  2. base_points ← 10

    8request_count = 29base_points = 1010bonus_points = score_bonus(request_count)
    values this step10base_points
  3. bonus_points = score_bonus(request_count)

    9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points
    values this step2request_count
  4. points ← 6

    17    integer :: points18    points = count * 319end function score_bonus
    values this step6points2count
  5. bonus_points ← 6

    9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points
    values this step6bonus_points
  6. total_points ← 16

    10bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_points
    values this step16total_points10base_points6bonus_points
  7. print '(I0, 1X, I0)', request_count, total_points

    11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_points
    output2 16
    values this step2request_count16total_points
  1. request_count ← 7

    8request_count = 79base_points = 10
    values this step7request_count
  2. base_points ← 10

    8request_count = 79base_points = 1010bonus_points = score_bonus(request_count)
    values this step10base_points
  3. bonus_points = score_bonus(request_count)

    9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points
    values this step7request_count
  4. points ← 21

    17    integer :: points18    points = count * 319end function score_bonus
    values this step21points7count
  5. bonus_points ← 21

    9base_points = 1010bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points
    values this step21bonus_points
  6. total_points ← 31

    10bonus_points = score_bonus(request_count)11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_points
    values this step31total_points10base_points21bonus_points
  7. print '(I0, 1X, I0)', request_count, total_points

    11total_points = base_points + bonus_points12print '(I0, 1X, I0)', request_count, total_points
    output7 31
    values this step7request_count31total_points
internal function `contains` lets the program define a local function used by the main workflow.
call step `score_bonus(request_count)` jumps to the function and returns a value.
composition The final total combines local state with the function result.