program demo_M_overload use, intrinsic :: iso_fortran_env, only : & & integer_kinds, int8, int16, int32, int64 use, intrinsic :: iso_fortran_env, only : & & real32, real64, real128 ! allow strings to be converted to integers use M_overload, only : int ! allow strings to be converted to floating point use M_overload, only : real,dble ! use == like .eqv. use M_overload, only : operator(==) ! use /= like .neqv. use M_overload, only : operator(/=) use M_overload, only : operator(//) ! take a single argument use M_overload, only : sign ! allow strings of different length on merge use M_overload, only : merge ! convert logical expressions to integer use M_overload, only : oz, zo, lt, le, eq, ne, gt, ge implicit none character(len=:),allocatable :: cmd character(len=*), parameter :: gen='(*("[",g0,"]":,","))' ! merge() with different string lengths expanded to longest write(*,gen)merge('a','bbbbb',1.eq.1) write(*,gen)merge('a','bbbbb',1.eq.2) write(*,gen)merge(['a','b'],['bbbbb','ccccc'],1.eq.2) ! int() can take strings representing a number as input' if(int('1234') .eq.1234) & & write(*,*)'int("STRING") works ' ! as can real() and dble() if(abs(real('1234.56789') - 1234.56789).lt.2*epsilon(0.0)) & & write(*,*)'real("STRING") works ' if(abs(dble('1234.5678901234567')- 1234.5678901234567d0).lt.epsilon(0.0d0)) & & write(*,*)'dble("STRING") works ' ! and logical values can be treated numerically write(*,*) merge('int works for .FALSE.','int fails for .FALSE.',int(.FALSE.).ne.0) write(*,*) merge('int works for .TRUE.','int fails for .TRUE.',int(.TRUE.).eq.0) write(*,*) sum(int([.true.,.false.,.true.])) ! and == and /= work for logical expressions if (.true. == .true. ) & & write(*,*)'== works like .eqv. for LOGICAL values' if (.true. /= .false. ) & & write(*,*)'/= works like .neqv. for LOGICAL values' ! // will allow any intrinsic type and convert it to a string write(*,*)' The value is '//10//' which is less than '//20.2 ! logical values as numeric values write(*,*) sum([int(.false.),int(.false.)]) write(*,*) int([.false.,.true.,.false.]) write(*,*) sum(int([.false.,.true.,.false.])) ! and sign() assumes the second argument is 1 write(*,*) merge('sign works','sign fails',& & sign(10_int8).eq.1 & & .and. sign(-10_int8).eq.-1 ) contains end program demo_M_overload