[J3] Default values for optional arguments

Jérémie Vandenplas jeremie.vandenplas at gmail.com
Wed Jan 20 09:05:07 UTC 2021


Dear all,

Some discussions on this topic were hold on github.com/j3-fortran (see
e.g., https://github.com/j3-fortran/fortran_proposals/pull/145,
https://github.com/j3-fortran/fortran_proposals/pull/175).
A first proposal was submitted and discussed. A summary of the committee 's
comments on the different propositions can be found here:
https://github.com/j3-fortran/fortran_proposals/issues/22

Yours sincerely,

Jeremie

Le mer. 20 janv. 2021 à 09:22, Steven G. Kargl via J3 <
j3 at mailman.j3-fortran.org> a écrit :

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.j3-fortran.org/pipermail/j3/attachments/20210120/d902a68c/attachment.htm>


More information about the J3 mailing list