Hello everyone,
As I talked earlier, I have a need for a good Fortran preprocessor, and
none of the fpp's out there like f90ppr, CoCo, Ratfor etc. has caught my
eye. The main reason is that they lack macro functionality. Somebody
replied and recommended that I check out the UNIX GNU m4 preprocessor
(http://www.seindal.dk/rene/gnu/man/m4_toc.html), and I did, and I like
it.
However, it lacks some features which I love about the other fpp's.
First, it is not at all Fortran like--its case sensitive, it doesn't
support the same basic arithmetic and logical operators, spaces are too
significant (so f (x) and f(x) are different) etc. What I would
ultimately love to see available (and please correct me if this is not
nice) is a preprocessor like CoCo *but* that offers m4-style macro
procedures that can be nested and recursive to any level (there are
other very nice features in m4):
For example, here is a sample (it has some holes in the syntax, I
know...) macro preprocessor routine that would specialize a cube
function to a given type:
?? macro CybeOfType (type, optional kind)
?? if (.not. present (kind)) kind="sp"
Function CubeOf?type?_?kind (x) Result (cube)
type(Kind = kind) :: x, cube
cube=x**3.0_?kind
End function
?? end macro CybeOfType
And then inside the program one would type:
CubeOfType( Real, sp) ! or just CubeOfType( Real)
to get a definition of x**3 for single precision numbers in the output
code:
Function CubeOfReal_sp (x) Result (cube)
Real(Kind = sp) :: x, cube
cube=x**3.0_sp
End function
Making generic interfaces, inlined functions, repetitve boundary loops
etc. can be very nicely made once nested and recursive macros are
allowed. Now, macros are not at all included in CoCo and one would need
to do some thinking about how to incoorporate them. Maybe make something
like a CoCo function/subroutine statement? I know CoCo is a done
standard, but I am just thinking.
Actually, I will try to write an m4 include file that provides wrapper
macros for something like the above. For one thing, I find the fact that
one needs to inclose the above multiline macro in a single ( and ) very
annoying. "Begin macro" and "end macro" or some equivalent seems so much
better. Does anybody have ideas on how to do that, or whether it's a
smart idea at all?
Thanks for listening,
Aleksandar
P.S. For those that care, Ted Stern gave me the following m4 variant of
the above macro (I tried to add some to it, but it may be wrong as I am
just starting to learn m4--the excessive quoting is still beyond my
head)
m4_define(`CubeOfType',`m4_dnl
m4_pushdef(`$2`)
m4_ifelse(`$2`, ,m4_define(`$2',`sp'))
Function CubeOf$1 (x) Result (cube)
type(Kind=$2) :: x, cube
cube=x**3.0_$2
End function
m4_popdef(`$2') # So we don't overwrite the second argument
') # isn't this anoying?
--
_____________________________________________
Aleksandar Donev
Physics Department
Michigan State University
East Lansing, MI 48824-1116
E-mail: [log in to unmask]
Work phone: (517) 432-6770
_____________________________________________
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|