LFortran now has an initial implementation of lfortran fmt
, see here for screenshots. Here are the current capabilities as of 0.7.0-132-g35f9ff82:
$ lfortran fmt -h
Format Fortran source files.
Usage: lfortran fmt [OPTIONS] file
Positionals:
file TEXT REQUIRED Fortran source file to format
Options:
-h,--help Print this help message and exit
-i Modify <file> in-place (instead of writing to stdout)
--spaces INT=4 Number of spaces to use for indentation
--indent-unit Indent contents of sub / fn / prog / mod
--no-color Turn off color when writing to stdout
What other options would people like to have so that LFortran could format the source code exactly as you like?
Based on our past discussions, it seems the three major styles are:
- Use 2 spaces and indent function bodies:
$ lfortran fmt --spaces 2 --indent-unit integration_tests/program_01.f90
program program_01
integer, parameter :: dp=kind(0.d0)
real :: a
integer :: i
print *, "Normal random numbers:"
do i = 1, 10
call rand(a)
print *, a
end do
contains
subroutine rand(x)
real, intent(out) :: x
logical, save :: first=.true.
real, save :: u(2)
real :: r2
if (first) then
do
call random_number(u)
u = ((2)*(u)) - (1)
r2 = sum((u)**(2))
if (((r2)<(1)).and.((r2)>(0))) then
exit
end if
end do
u = (u)*(sqrt(((-(2))*(log(r2)))/(r2)))
x = u(1)
else
x = u(2)
end if
first = .not.(first)
end subroutine rand
end program program_01
- Use 4 spaces, but do not indent function bodies:
$ lfortran fmt --spaces 4 integration_tests/program_01.f90
program program_01
integer, parameter :: dp=kind(0.d0)
real :: a
integer :: i
print *, "Normal random numbers:"
do i = 1, 10
call rand(a)
print *, a
end do
contains
subroutine rand(x)
real, intent(out) :: x
logical, save :: first=.true.
real, save :: u(2)
real :: r2
if (first) then
do
call random_number(u)
u = ((2)*(u)) - (1)
r2 = sum((u)**(2))
if (((r2)<(1)).and.((r2)>(0))) then
exit
end if
end do
u = (u)*(sqrt(((-(2))*(log(r2)))/(r2)))
x = u(1)
else
x = u(2)
end if
first = .not.(first)
end subroutine rand
end program program_01
- Use 4 spaces and indent function bodies:
$ lfortran fmt --spaces 4 --indent-unit integration_tests/program_01.f90
program program_01
integer, parameter :: dp=kind(0.d0)
real :: a
integer :: i
print *, "Normal random numbers:"
do i = 1, 10
call rand(a)
print *, a
end do
contains
subroutine rand(x)
real, intent(out) :: x
logical, save :: first=.true.
real, save :: u(2)
real :: r2
if (first) then
do
call random_number(u)
u = ((2)*(u)) - (1)
r2 = sum((u)**(2))
if (((r2)<(1)).and.((r2)>(0))) then
exit
end if
end do
u = (u)*(sqrt(((-(2))*(log(r2)))/(r2)))
x = u(1)
else
x = u(2)
end if
first = .not.(first)
end subroutine rand
end program program_01
Feel free to comment here or open issues at: https://gitlab.com/lfortran/lfortran/-/issues
I am aware of:
- #201: not printing parentheses around expressions if not needed