7
Fortanでは、要素サブルーチンにインテント(inout)とインテント(out)引数を持たせることができますが、要素関数はインテント(in)のみ可能です。Fortran要素関数と要素サブルーチン
なぜですか?それは単なる文法的なコンベンションですか、あるいは、関数の呼び出しとサブルーチンの呼び出しについて一般的に異なるものがありますか?
すなわち、
Elemental Integer Function FOO(i)
Integer, intent(in) :: i
...
FOO=something
End Function
と
Elemental Subroutine FOO(i, v)
Integer, intent(in) :: i
Integer, intent(out) :: v
...
v=something
End Subroutine
— FOOのこれらの実装は等価的に効率的ですか?
私はそれを理解することはできません、それは副作用がある場合、それを純粋な手順と呼ぶのはあまり意味がありません。私は推測を危険にさらし、要素関数が並列化の文脈においてより効率的であるかもしれないと言うことで、プロシージャがどのように動作するかをコンパイラに明確にしている。 – bdforbes
私は、サブルーチンがそれ自身の引数だけを変更し、グローバル変数に触れなければ、そのようなサブルーチンを効率的にコンパイルすることは難しくないと思います。このような機能を持つことは理にかなっています。たとえば、乱数ジェネレータは、乱数シーケンスの状態(整数の配列で記述)を変更し、乱数を返す必要があります。したがって、それは1つのインテント(inout)と1つのインテント(out)引数を持つ必要があります。確かに、ユーザは、共有変数をそのようなサブルーチンに渡すことによって物事を混乱させる可能性があります。しかし、もう一度、プログラミングのパラダイムは愚かではありません。 – drlemon