[J3] Default values for optional arguments
Thomas König
tk at tkoenig.net
Wed Jan 20 07:32:18 UTC 2021
A somewhat common thing to do for optional arguments is to set them
to a default value if the caller did not specify anything. One idiom
to do this would be
subroutine foo(a, b)
integer, intent(in), optional :: b
integer :: b_val
...
if (present(b)) then
b_val = b
else
b_val = 42
end if
and then use b_val and c_val. This idiom is wasteful of lines (as
written, it takes five lines of code for a single default value). More
importantly, it is also error-prone because it is necessary to remember
to use b_val instead of b.
The first drawback could be mitigated by doing something like
if (present(b)) b_val = b
if (.not.present(b)) b_val = 42
(not very clear, in my opinion) or by using yet-to-be-added conditional
expressions, but people would still have to use a different variable
name for essentially the same thing.
What could help is to add some way to express default initialization for
optional arguments, something along the lines of
integer, intent(in), optional :: b = 42
or
integer, intent(in), optional, default (42) :: b
Opinions?
Best regards
Thomas
More information about the J3
mailing list