Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"do / else" proposal #342

Open
certik opened this issue Oct 31, 2024 · 5 comments
Open

"do / else" proposal #342

certik opened this issue Oct 31, 2024 · 5 comments

Comments

@certik
Copy link
Member

certik commented Oct 31, 2024

https://fortran-lang.discourse.group/t/for-else-or-do-else-in-fortran/8696

Example:

condition = .false.
do i = 1, 10
    .......
    if (condition) exit
else
    ! This block only executes if the do loop doesn't exit.
    error stop "Condition not met"
enddo

which would be equivalent to:

condition = .false.
do i = 1, 10
    ......
    if (condition) exit
enddo
if (.not. condition) error stop "Condition not met"

Similar to Python's "for else": https://docs.python.org/3/tutorial/controlflow.html#else-clauses-on-loops

@everythingfunctional
Copy link
Member

Just to be clear, the above is equivalent to the below?

condition = .false.
do i = 1, 10
    ...
    if (condition) exit
end do
if (i > 10) then
    ! This block only executes if the do loop doesn't exit.
    error stop "Condition not met"
end if

@certik
Copy link
Member Author

certik commented Oct 31, 2024

Yes. I updated the above description with an example. (I don't like using loop variables after the loop, but that's a separate issue: is it even specified by the standard?)

@everythingfunctional
Copy link
Member

is it even specified by the standard?

Yes, although it's not immediately obvious. From 11.1.7.4.3 The execution cycle

The DO variable, if any, is incremented by the value of the incrementation parameter m3

and from 11.1.7.4.5 Loop termination

When a DO construct becomes inactive, the DO variable, if any, of the DO construct retains its last defined value.

So if a do loop completes all its iteration, the standard says it has a value > the ending value.

@certik
Copy link
Member Author

certik commented Nov 1, 2024

@everythingfunctional thanks for the clarification!

@klausler
Copy link

klausler commented Nov 1, 2024

Looks like syntactic vinegar for the existing and less mysterious

search: block
  do j = 1, 10
    ...
    if (condition) exit search
  end do
  error stop 'nope'
end block

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants