# (j3.2006) Irksome not to be able to invoke type-bound function on an expression

Van Snyder Van.Snyder
Mon Sep 26 21:31:53 EDT 2016

```I have a type ECR_t that represents Earth-centered-rotating Cartesian
coordinates as 3-vectors.  It has type-bound functions and operators to
add, subtract, scale, compute 2-norm, and other stuff.

I'd like to compute

s = ( ( myP + myH * myP%grad_geoid() - line(1) )%norm2()

but this is prohibited, so I need either to export norm2() as an
ordinary (not type-bound) function and use

s = norm2( myP + myH * myP%grad_geoid() - line(1) )

or

temp = ( ( myP + myH * myP%grad_geoid() - line(1) )
s = temp%norm2()

One particularly important case is function composition.  I'd like to
use something like

s = a%f1()%f2()

Is there a good reason we can't eventually allow to invoke a type-bound
function using an expression, and in particular using the result of
another type-bound function?

A related question is whether we can eventually select components from a
function result (or more general expression).  I have a function Geod()
bound to ECR_t that computes 3-dimensional geodetic coordinates
(longitude, geodetic latitude, and geodetic height), from
Earth-centered-rotating Cartesian coordinates.  The iteration (Either
Bowring's or Fukushima's) that does this necessarily computes both
geodetic latitude and geodetic height.  But sometimes all I want is
geodetic latitude.  My type H_V_Geod that represents 3-dimensional
geodetic coordinates is an extension of the one H_Geod that represents
only longitude and geodetic latitude.

If I have

type(ECR_t) :: V
type(H_Geod) :: Geod

I can't get the geodetic surface components (longitude and geodetic
latitude) of V using

geod = v%geod()%h_geod

I need something like

type(H_V_Geod) :: Temp
temp = v%geod()
geod = temp%h_geod

Is there a good reason we can't eventually allow to select a component
of an expression?

```