2

これは再開された質問です。

私は言語とそのサポートプラットフォームを探しています。この言語には、デフォルトで参照渡しまたは名前渡しのセマンティクスがあります。私は歴史を少し知っています。Algol、Fortranがあり、それを可能にするC++がまだあります。しかし、基本的に、私が探しているのは、より現代的なものであり、前述のバリューパス方法論が優先れ、デフォルトで(暗黙的に想定されています)。

私の考えでは、pass-by-ref / nameの利点のいくつかは明らかなように思われるので、この質問をします。たとえば、スタンドアロンエージェントで使用する場合、値のコピーは(ある程度)必要なく、その場合、パフォーマンスはそれほど低下しません。そのため、リッチクライアントアプリやゲームスタイルまたはスタンドアロンのサービスのようなアプリケーションで使用できます。

私にとっての主な利点は、シンボルのアイデンティティとその現在の値が明確に分離されていることです。つまり、冗長なコピーがない場合は、照会/受信した正確なシンボル/パスを使用していることがわかります。そして、値の興味をそそるボクシングは、プログラムの実際のロジックに干渉しません。

C#キーワードがあることは知っていますがref、それは許容できるものの、それほど直感的ではありません。同様に、参照渡しのセマンティクスは、事実上すべての言語(インスタント例としてJava)などでシミュレートできることを認識しています。名前による渡しについてはよくわかりません:)

あなたは何をお勧めしますか-それが適切であるところならどこでもそのようなニーズのためにDSLのようなものを作成してください。または私がすでに知っているいくつかの言語を使用しますか?たぶん、私が見逃しているものがありますか?

ありがとうございました!

更新:現在、Haskellが適切だと思います。しかし、あまり調べていなかったので、後でこのテキストを更新すると思います。

4

6 に答える 6

5

Scalaは、実際のcall-by-nameを含む非常に柔軟なパラメーター受け渡しセマンティクスを提供します。

def whileLoop(cond: => Boolean)(body: => Unit) {
  if (cond) {
    body
    whileLoop(cond)(body)
  }
}

そして、それは本当にうまくいきます

var i = 10
whileLoop (i > 0) {
  println(i)
  i -= 1
}

技術的な詳細: Java と同様に、すべてのパラメーターは値によって渡されますが (これらは通常は参照です)、表記法=> Typeにより、Scala は名前による呼び出しをエミュレートするために必要なクロージャーを自動的に生成します。

遅延評価もあることに注意してください。

lazy val future = evalFunc()


興味深いのは、一貫した厳密な値渡しのセマンティクスを持ちながら、本当に必要な場所でこれらを正確に変更できることです。ほとんど構文上のオーバーヘッドはありません。

于 2010-05-23T09:01:05.133 に答える
4

Haskellは、デフォルトの(そして実際に唯一の)評価戦略として、必要に応じて電話をかけています。

さて、あなたは2つのことを求めました:名前による呼びかけと現代。ええと、Haskellは純粋な言語であり、純粋な言語では、名前による呼び出しと必要による呼び出しは意味的に同じものです。より正確には、常に同じ結果になります。唯一の違いは、必要による呼び出しは次のとおりです。通常は高速で、最悪の場合、名前による呼び出しよりも一定の係数だけ遅くなります。そして、Haskellは確かに現代語です。それはたった23歳であり、その機能の多くにおいて、実際には最近作成された多くの言語よりも10年進んでいます。

あなたが尋ねたもう一つのことは、参照による呼び出しです。繰り返しますが、純粋な言語では、値による呼び出しと参照による呼び出しは同じものですが、後者の方が高速です。(そのため、ほとんどの関数型言語は通常、値による呼び出しとして記述されていますが、実際には参照による呼び出しを実装しています。)

現在、名前による呼び出し(および拡張による必要による呼び出し)は、値による呼び出し(および拡張による参照による呼び出し)と同じではありません。これは、名前による呼び出しが結果を返す可能性があるためです。値による呼び出しが終了しない場合。

ただし、値による呼び出しまたは参照による呼び出しが終了するすべての場合において、純粋な言語では、値による呼び出し、参照による呼び出し、名前による呼び出し、および必要による呼び出しは同じです。もの。そして、それらが同じものではない場合、名前による呼び出しと必要による呼び出しは、値による呼び出しと参照による呼び出しの場合に答えを与えるため、ある意味で「より良い」です。基本的には無限ループに陥っていたでしょう。

エルゴ、ハスケルがあなたの答えです。おそらくあなたが探していたものではありませんが:-)

于 2010-05-23T08:00:32.693 に答える
4

通りすがりの名前は、最近ではまれです。ただし、ほとんどの関数型プログラミング言語では、ラムダ ニルを使用してシミュレートできます。

// Pass by value
(dosomething (random))
// Pass by name hack
(dosomething (lambda () (random)))

その他: ML と O'CaML では、値渡し (デフォルト)、参照渡し (ref 変数を使用)、そしてもちろんラムダの使用が区別されます。ただし、どちらも「現代」言語としての資格があるかどうかはわかりません。

于 2010-05-23T07:12:01.470 に答える
2

refC#とout修飾子が「本質的」ではない理由についてのあなたの推論には完全に従っていません。あなたが探しているものをほぼ正確に提供しているように思えます:値渡しと参照渡しをサポートする最新の言語と環境。(Little Bobby Tables が指摘したように、最近では名前による受け渡しは非常にまれです。ラムダ/クロージャを使用したほうがよいでしょう。)

于 2010-05-23T07:26:20.373 に答える
1

私の知る限り、最新のFortranは参照渡しです(古いFORTRANとの互換性を維持しています)。

現代の Fortran は、モジュラー言語に期待される優れた機能をすべて備えているため、優れたシステムを構築できます。なぜなら、「Fortran は時代遅れ」であり、誰もが「クールだから」C# でコードを書きたがるからです。

于 2010-05-23T07:40:42.617 に答える
-1

Java では、すべてのオブジェクトが参照によって渡されます。

于 2010-05-23T08:26:15.287 に答える