[J3] [EXTERNAL] Re: Default values for optional arguments

Clune, Thomas L. (GSFC-6101) thomas.l.clune at nasa.gov
Wed Jan 20 19:19:38 UTC 2021


I think the issue is when you have longer interfaces with potentially several optional arguments.  The conventional approach "works" but does not make the default value self-evident to the user.   It is (a) not part of the interface and (b) the default value for the last of the optional arguments will be buried several lines into the executable section.   (If not deeper, depending on other stylistic decisions.)

Probably not the topmost priority for most, but certainly an feature that has been requested numerous times.


On 1/20/21, 3:22 AM, "J3 on behalf of Steven G. Kargl via J3" <j3-bounces at mailman.j3-fortran.org on behalf of j3 at mailman.j3-fortran.org> wrote:

    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