最近、私が使用してきたほとんどの最新のプログラミング言語(C / C ++、C#、F#、Ruby、Python、JSなど)では、何を決定するための言語サポートがあったとしてもごくわずかであることに、ますます苛立ちを感じていますサブルーチンが実際に行います。
次の単純な疑似コードを考えてみます。
var x = DoSomethingWith(y);
DoSomethingWith(y)への呼び出しが実際に何を行うかをどのように判断しますか?それのmutateますyは、またはそれはのコピーを返しますyは?グローバルまたはローカルの状態に依存していますか、それともyにのみ依存していますか?グローバルまたはローカルの状態が変わりますか?閉鎖は通話の結果にどのように影響しますか?
私が遭遇したすべての言語で、これらの質問のほとんどは、サブルーチンのシグネチャを見ただけでは答えられず、コンパイル時または実行時のサポートもほとんどありません。通常、唯一の方法は、APIの作成者に信頼を置くことであり、ドキュメントや命名規則が、サブルーチンが実際に何をするかを明らかにすることを期待しています。
私の質問はこれです 。今日、これらのタイプのシナリオを象徴的に区別し、実際に記述できるコードにコンパイル時の制約を課す言語はありますか?
(もちろん、スコープやクロージャのレベルの違い、静的コードとインスタンスコードの分離、ラムダ関数などのように、ほとんどの現代の言語ではこれに対するいくつかのサポートがあります。しかし、これらは互いに衝突するように見えることがあまりにも多いです。たとえば、ラムダ関数は通常、純粋に機能し、入力パラメーターに基づいて値を返すか、何らかの方法で入力パラメーターを変更します。しかし、通常は、ラムダ関数から静的変数にアクセスすることができます。インスタンス変数へのアクセスを許可すると、すべてがバラバラになります。)