# Overloaded asterisk

**URL:** <https://fortran-lang.discourse.group/t/overloaded-asterisk/5646>\
**Category:** Help\
**Created:** [April 25, 2023, 6:09am UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646 "2023-04-25T06:09:11Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![Harper](https://avatars.discourse-cdn.com/v4/letter/h/b5ac83/32.png) [@Harper](https://fortran-lang.discourse.group/u/Harper)\
**Post date:** [April 25, 2023, 6:09am UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/1 "2023-04-25T06:09:11Z")

</div>

Years ago I wrote a Fortran 95 fixed source form program that has 19 different uses of the asterisk \*, compiles and runs. Below is a Fortran 2018 version with 23 of them. It compiles and runs, though the two compilers I tried, gfortran and ifort, both gave some warnings. Are there any uses of \* that I missed?

```auto
C Program to show 23 ways Fortran uses the asterisk. Comments at ends of 
* lines mark uses of *, as here: ! Comment line, * character in it. (1,2)
C This program is valid Fortran 2018, but its fixed source form, alternate
C return, and declaration beginning character* are all obsolescent. Class(*) 
C was new in f2003, unlimited format in F2008, and type(*) and rank(*) in
C F2018. List-directed internal read, use of lower case, and comments that
C begin with ! are its only other features that were not valid Fortran 77.
      program test23stars
      character:: b,c,d='?'
      integer j,k,n(2)
      data j,k/2*0/ ! repeated value in data (3)
      call input(n,'2*4',b,c,d,*666)! repeated value in list-directed input, 
C ! alternate return (4,5)
      write(*,'(2i2,1x,a)') n(1)*j, ! default output unit ! multiply (6,7)
     * n(2)**k,b ! continuation line ! exponentiate (8,9)
      stop
 666 print '(a)', ' * error in n' ! in non-comment character string (10)
      print '(*(i4))', n ! unlimited format item (11)

      contains

      subroutine input(n,a,b,c,d,*) ! dummy alternate return argument (12)
      integer,intent(out)::n(*) ! assumed-size array (13)
      character,intent(in)::a*(*) ! length selector ! assumed length
C following variable name (14,15)
      character*(*),intent(out)::b ! length selector ! assumed length
C following character keyword (16,17)
      type(*),intent(in)::c ! assumed-type (18)
      character(1),intent(in)::d(..)
      integer i
      character ch
      class(*),allocatable:: e(:) ! polymorphic entity (19)
      select rank (d)
      rank(*) ! rank selector (20)
      print "(a)",'This should not be printed!'
      end select
      read(a,*,iostat=i) n(1),n(2) ! list-directed internal read (21)
      if (i.ne.0) return 1
      print '(a)', 'Enter anything to continue.'
      read(*,'(a)',iostat=i)ch ! default input unit (22)
      write(b,'(i1)',iostat=i)666 ! writes '*' as 666 won't fit in i1 (23) 
      end subroutine input
      end program test23stars

```

---

<div class="post-metadata">

**Author:** ![Arjen](https://avatars.discourse-cdn.com/v4/letter/a/b9bd4f/32.png) [@Arjen](https://fortran-lang.discourse.group/u/Arjen)\
**Post date:** [April 25, 2023, 6:21am UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/2 "2023-04-25T06:21:01Z")

</div>

And there I am, thinking bad of C and C++ for reusing symbols like \* and & for so many purposes that I get lost even trying to imagine the first few …

---

<div class="post-metadata">

**Author:** ![JeffH](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/jeffh/32/595_2.png) [@JeffH](https://fortran-lang.discourse.group/u/JeffH)\
**Post date:** [April 25, 2023, 9:32am UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/3 "2023-04-25T09:32:14Z")

</div>

Sadly, in 2023, most of our programming languages are syntactically limited by the keyboards of the 1950s, and in many cases (but not Fortran) by the properties of Dennis Ritchie’s workstation. However, I’d rather figure out the multiple meanings of `*` than program in Unicode ala APL.

I can’t help but thing of [Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo - Wikipedia](https://en.wikipedia.org/wiki/Buffalo_buffalo_Buffalo_buffalo_buffalo_buffalo_Buffalo_buffalo) when I see programs like this. This one is far more readable though, and I think it’s a nice contribution.

---

<div class="post-metadata">

**Author:** ![Beliavsky](https://avatars.discourse-cdn.com/v4/letter/b/ba8739/32.png) [@Beliavsky](https://fortran-lang.discourse.group/u/Beliavsky)\
**Post date:** [April 25, 2023, 3:29pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/4 "2023-04-25T15:29:37Z")

</div>

You mention `*` for reading from standard output, but a new programmer will first use `*` to `print` or `write` to standard output.

---

<div class="post-metadata">

**Author:** ![urbanjost](https://avatars.discourse-cdn.com/v4/letter/u/0ea827/32.png) [@urbanjost](https://fortran-lang.discourse.group/u/urbanjost)\
**Post date:** [April 25, 2023, 5:20pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/5 "2023-04-25T17:20:14Z")

</div>

A quick glance did not show NAMELIST groups and DATA statements, where it can be used as a repeat count similar to list directed input; but distinct uses IMO.

---

<div class="post-metadata">

**Author:** ![RonShepard](https://avatars.discourse-cdn.com/v4/letter/r/a3d4f5/32.png) [@RonShepard](https://fortran-lang.discourse.group/u/RonShepard)\
**Post date:** [April 25, 2023, 7:09pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/6 "2023-04-25T19:09:25Z")

</div>

> [@urbanjost](#):
>
> A quick glance did not show NAMELIST groups and DATA statements, […]

DATA is there, NAMELIST i/o is not. There is an example of integer i/o overflow, but maybe some floating point examples could also be included (there are several types).

---

<div class="post-metadata">

**Author:** ![certik](https://yyz2.discourse-cdn.com/free1/user_avatar/fortran-lang.discourse.group/certik/32/4_2.png) [@certik](https://fortran-lang.discourse.group/u/certik)\
**Post date:** [April 25, 2023, 7:57pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/7 "2023-04-25T19:57:30Z")

</div>

@Harper haha, that’s awesome. Here is one for you: [Some cryptic source examples](https://fortran-lang.discourse.group/t/some-cryptic-source-examples/5661).

---

<div class="post-metadata">

**Author:** ![Harper](https://avatars.discourse-cdn.com/v4/letter/h/b5ac83/32.png) [@Harper](https://fortran-lang.discourse.group/u/Harper)\
**Post date:** [April 25, 2023, 9:36pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/8 "2023-04-25T21:36:54Z")

</div>

My \* program does write to standard output in the line that ends `(6,7)` but I shall have to think about NAMELIST and floating-point i/o.

---

<div class="post-metadata">

**Author:** ![urbanjost](https://avatars.discourse-cdn.com/v4/letter/u/0ea827/32.png) [@urbanjost](https://fortran-lang.discourse.group/u/urbanjost)\
**Post date:** [April 26, 2023, 12:41am UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/9 "2023-04-26T00:41:28Z")

</div>

Seeing them all together was a little startling even though I knew them. Finally got a chance to  
look at it. I think this one deserves consideration:

```
  character(len=*),parameter :: arr(*)=['aA','bB','cC'] ! length and array size on parameter

```

This is sort of a toss-up for me …

```
  write(*,'(*(g0,1x))')[1,2,3]*2**2 ! array multiplication

```

Cannot decide if array multiplication versus scalar multiplication should be given its own due or not.

---

<div class="post-metadata">

**Author:** ![RonShepard](https://avatars.discourse-cdn.com/v4/letter/r/a3d4f5/32.png) [@RonShepard](https://fortran-lang.discourse.group/u/RonShepard)\
**Post date:** [April 26, 2023, 9:26pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/10 "2023-04-26T21:26:26Z")

</div>

I just wanted to add the obvious, if you think `*` is overloaded/overused within fortran, then what is your opinion of parentheses? 🙂

---

<div class="post-metadata">

**Author:** ![RonShepard](https://avatars.discourse-cdn.com/v4/letter/r/a3d4f5/32.png) [@RonShepard](https://fortran-lang.discourse.group/u/RonShepard)\
**Post date:** [April 26, 2023, 9:31pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/11 "2023-04-26T21:31:40Z")

</div>

> [@urbanjost](#):
>
> `write(*,'(*(g0,1x))')[1,2,3]*2**2 ! array multiplication`

The unlimited repeat count in that format is another case, regardless of the scalar/array question.

---

<div class="post-metadata">

**Author:** ![FortranFan](https://avatars.discourse-cdn.com/v4/letter/f/96bed5/32.png) [@FortranFan](https://fortran-lang.discourse.group/u/FortranFan)\
**Post date:** [April 26, 2023, 11:22pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/12 "2023-04-26T23:22:19Z")

</div>

> [@RonShepard](#):
>
> The unlimited repeat count in that format is another case …

OP has already covered this - item marked (11).

---

<div class="post-metadata">

**Author:** ![Harper](https://avatars.discourse-cdn.com/v4/letter/h/b5ac83/32.png) [@Harper](https://fortran-lang.discourse.group/u/Harper)\
**Post date:** [April 27, 2023, 5:12am UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/13 "2023-04-27T05:12:46Z")

</div>

Like many things, parentheses are a necessary evil. If you think Fortran needs too many of them, keep away from Lisp.

---

<div class="post-metadata">

**Author:** ![RonShepard](https://avatars.discourse-cdn.com/v4/letter/r/a3d4f5/32.png) [@RonShepard](https://fortran-lang.discourse.group/u/RonShepard)\
**Post date:** [April 27, 2023, 5:22am UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/14 "2023-04-27T05:22:53Z")

</div>

Lisp is the second-oldest programming language, only three years younger than Fortran.

---

<div class="post-metadata">

**Author:** ![Harper](https://avatars.discourse-cdn.com/v4/letter/h/b5ac83/32.png) [@Harper](https://fortran-lang.discourse.group/u/Harper)\
**Post date:** [April 27, 2023, 8:18am UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/15 "2023-04-27T08:18:53Z")

</div>

Lisp is not the second-oldest programming language: Plankalkul 1944-1945, Laning and Zierler system 1952, Fortran 1957, Algol 58 1958, Cobol 1959, Lisp and Algol 60 1960. (Sorry I don’t know how to put an umlaut on u in Fortran Discourse.)

---

<div class="post-metadata">

**Author:** ![RonShepard](https://avatars.discourse-cdn.com/v4/letter/r/a3d4f5/32.png) [@RonShepard](https://fortran-lang.discourse.group/u/RonShepard)\
**Post date:** [April 27, 2023, 4:55pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/16 "2023-04-27T16:55:03Z")

</div>

I guess I needed more qualifiers in my statement. from [Lisp (programming language) - Wikipedia](https://en.wikipedia.org/wiki/Lisp_(programming_language))

“Originally specified in 1960, Lisp is the second-oldest high-level programming language still in common use, after Fortran.”

---

<div class="post-metadata">

**Author:** ![Arjen](https://avatars.discourse-cdn.com/v4/letter/a/b9bd4f/32.png) [@Arjen](https://fortran-lang.discourse.group/u/Arjen)\
**Post date:** [April 27, 2023, 6:24pm UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/17 "2023-04-27T18:24:56Z")

</div>

You could use the “e” to express an umlaut with basic ASCII: Plankalkuel. (Though I guess my keyboard does allow me to write Plankalkül directly …)

---

<div class="post-metadata">

**Author:** ![Harper](https://avatars.discourse-cdn.com/v4/letter/h/b5ac83/32.png) [@Harper](https://fortran-lang.discourse.group/u/Harper)\
**Post date:** [April 28, 2023, 12:00am UTC](https://fortran-lang.discourse.group/t/overloaded-asterisk/5646/18 "2023-04-28T00:00:01Z")

</div>

Thanks to @RonShepard and @urbanjost my test23stars program has grown to test29stars. Here is the new version, with a little tidying up.

```auto
C Program to show 29 ways Fortran uses the asterisk. This program is valid
C Fortran 2018, but its fixed source form, alternate return, and declarations
C beginning with character* are all obsolescent. Namelist first appeared in
C the F90 Fortran standard, class(*) and namelist with internal access in
C F2003, unlimited format in F2008, and type(*) and rank(*) in F2018. All the
C other uses of * were already in F77. though namelist I/O was an Oracle
C extension to F77 with a slightly different syntax.

      program test29stars
* Comments mark uses of * , as here:! Comment line, * character in it. (1,2)
      character(2):: c,d='?'
      character(10):: b(4),ch
      integer j,k,n(2)
      data j,k/2*0/ ! repeated value in data (3)
      call input(n,'2*4',b,c,d,*666)! repeated value in list-directed input, 
C ! alternate return (4,5)
      write(*,'(2i2,1x,4a)') n(1)*j,! default output unit ! multiply (6,7)
     * n(2)**k,' '//b ! continuation line ! exponentiate (8,9)
      stop
 666 print '(a)', ' * error in n' ! in non-comment character string (10)
      print '(*(i4))', n ! unlimited format item (11)

      contains

      subroutine input(n,a,b,c,d,*) ! dummy alternate return argument (12)
      integer,intent(out)::n(*) ! assumed-size array (13)
      character,intent(in)::a*(*) ! length selector ! assumed length
C following variable name (14,15)
      character*(*),intent(out)::b(:)! length selector ! assumed length
C following character keyword (16,17)
      type(*),intent(in)::c ! assumed-type (18)
      character(2),intent(in)::d(..)
      integer:: i,nl(6)!!!=42
      integer,parameter:: e(*)=[1,2]! implied-shape array (19)
      character(18)::nlin='&nlstuff nl=6*666/'! repeat in namelist input(20)
      namelist/nlstuff/nl
      class(*),allocatable:: f(:) ! polymorphic entity (21)
      read(nlin, nml=nlstuff)
      write(6, nml=nlstuff) ! repeat in namelist output (22)
      select rank(d)
      rank(*) ! rank selector (23)
      print "(a)",'This should not be printed!'
      end select
      read(a,*,iostat=i) n(1),n(2) ! list-directed internal read (24)
      if (i.ne.0) return 1
      print '(a)', 'Enter anything to continue.'
      read(*,'(a)',iostat=i)ch ! default input unit (25)
      write(b(1),'(i1)',iostat=i)42 ! integer output * if too big (26) 
      write(b(2),'(f2.0)',iostat=i)42.0 ! real output * if too big (27) 
      write(b(3),'(e10.4e1)',iostat=i)42e-20! real output * if too small(28)
      write(b(4),'(e8.4)',iostat=i)42.0 ! real output, bad format (29)
      end subroutine input
      end program test29stars

```
