[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
       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


   integer, intent(in), optional, default (42) :: b


Best regards


More information about the J3 mailing list