[J3] Default values for optional arguments

Steven G. Kargl kargl at uw.edu
Wed Jan 20 08:21:48 UTC 2021


On Wed, Jan 20, 2021 at 08:32:18AM +0100, Thomas König via J3 wrote:
> 
> 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

Looks straightforeward and easy for a reader to comprehend.


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

Doesn't this imply the SAVE attribute?  Although, I believe 
th Standard says SAVE and OPTIONAL conflict.

> or
> 
>   integer, intent(in), optional, default (42) :: b
> 
> Opinions?
> 

What's wrong with

   b_val = 42
   if (present(b)) b_val = b

?

If you want to do it on one line

   b_val = 42 ; if (present(b)) b_val = b

-- 
Steve


More information about the J3 mailing list