文字型変数と他の型の変数の変換には内部ファイルへの READ/WRITE を用います。内部ファイルへの I/O があった場合、pure 性が保たれるのか気になったので試してみました。結論からいうと pure でした。
内部ファイルの I/O は型変換の代入に近いので、もっともな仕様だと思います。66 時代には ENCODE/DECODE 関数で型変換してわけだし。
pure で elemental な関数は気持ちよいものなのでありがたいです。試しとして、FizzBuzz を作ってみました。Fortran 的には、非伝統的な問題で、いまいち何が面白いのか分からないんですけど、許してください。(西洋の宴会芸の一種のようです。)
ソース・コード
Fortran2003 以降の機能を使って書いてみました。g0 format はFortran2008 で導入された機能です。
elemental な関数が文字配列を返す状況では、出力の文字列長がすべて同じ長さになってなければいけないようなので、文字長を 8 文字固定にしました。8 桁の数字までしか扱えませんが十分でしょう。
なおスカラー呼び出しの場合は、関数返り値の定義を文字列長が可変になるように allocable なスカラー文字変数にしてやれば、異なる長さで返すことができます。
module m_fb implicit none contains pure elemental character(8) function fb(i) integer, intent(in) :: i write(fb, '(g0)') i if (mod(i, 3) == 0) fb = 'fizz' if (mod(i, 5) == 0) fb = 'buzz' if (mod(i, 15) == 0) fb = 'fizzbuzz' return end function fb end module m_fb program fizzbuzz use m_fb implicit none print '(15(g0))', fb([1:100]) stop end program fizzbuzz