web-dev-qa-db-ja.com

F#にインタラクティブモードがあるのにC#がないのはなぜですか?

F#には、対話型REPLが付属しています。 C#にはそのようなものはなく、実際には完全なプロジェクトをセットアップしないとプレイするのが少し難しいです(ただし、LINQpadは機能し、Powershellを介して行うこともできます)。

F#でインタラクティブコンソールを使用できるが、C#での実装を困難にする言語について、根本的に異なるものはありますか?


何年も経った今でも、この問題に人々が参加しているので、今は多くの選択肢があることに注意してください。 Powershell(すべての最新のWindowsマシンにプリインストールされています)を使用して、.Netフレームワークで遊ぶことができます。または、 LINQpadを使用して任意のc#コードのプロトタイプを作成する を使用できます。または、 ScriptCs を使用するか、または Complify.net または Jsil のようなオンラインのjsfiddleタイプの環境を使用できます。たくさんのオプション。

32
George Mauer

F#でインタラクティブコンソールを使用できるが、C#に実装するのが難しい言語について、根本的に異なるものはありますか?

はい。

F#はMLプログラミング言語の子孫であり、LISPやSchemeなどの言語から大きな影響を受けました。これらの言語は、最初から3つのニースプロパティを持つように設計されています。

まず、これらの言語には、C#での考え方ステートメントがありません。むしろ、ほとんどすべてがを持つなので、評価してから値を印刷するメカニズムは、ほとんどすべての状況で理にかなっています。

第2に、これらの言語は副作用を伴うプログラミングを阻止するため、グローバルな状態を台無しにすることを心配せずに評価を行うことができます。

第三に、これらの言語で行うほとんどの作業は「トップレベル」です。通常、「クラス」や「名前空間」などのコンテキストは含まれません。

対照的に、C#は副作用を生成するステートメントによる制御フローのプログラミングを強調しており、それらのステートメントは常に名前空間、クラス、メソッドなどの入れ子になった複数のコンテナーにあります。

したがって、これらはC#がREPLを持つのを難しくするすべてのものですが、確かに不可能です。通常のコンテキストの外に現れるステートメントと式のセマンティクスは何か、名前のバインディングを変更するミューテーションのセマンティクスは何かなどを理解する必要があるだけです。

F#にインタラクティブモードがあるのにC#がないのはなぜですか?

F#チームは、REPLループを優先することが1つのシナリオであると決定しました。C#チームは、歴史的にそうではありませんでした。機能が、最も優先度の高い機能でない限り、実装されません。予算;今まで、C#REPLはリストの一番上にいませんでした。

RoslynプロジェクトにはC#REPLが含まれています(最終的にはVB REPLも含まれますが、まだ準備ができていませんそれのプレビューリリースをダウンロードして、自分の好みを確認することができます。

http://www.Microsoft.com/en-us/download/details.aspx?id=27746

56
Eric Lippert

MonoにはC#replがあります: http://www.mono-project.com/CsharpRepl

グラフィックオブジェクトを直接操作したり、Gtk#ウィジェットを作成したりできるGUIバージョンもあります。

enter image description here

22
Lee

それは主に歴史的なものだと思います。 REPL環境は常に関数型言語に関連付けられており、MLファミリー言語が含まれており、F#はその伝統に忠実であり続けます。インタラクティブな環境は、機能的なバックグラウンドから来たユーザーが当然のことと考えているものです。そのような機能の欠如は、VSと、さらにはF#を不利にしてしまいます。

一方、OOPコミュニティでは、このような機能が一般的ではありませんでした。

ただし、C、JavaまたはC#を含む)の多くの非関数型言語で利用可能なREPLがあります。また、本格的なREPLとはかけ離れていますが、VSのAutos機能は、 C#で実行できます。

2
scrwtp

C#は主にオブジェクト指向であると思います。最も単純なコードを書くためにも、それを複数のクラスに分割する必要があります。 REPLを使用するには、多くのコードを記述する必要があります。

F#が主に機能している場合はこの問題は発生せず、複雑なコードでも簡単に記述して、後でオブジェクトに変換できます。

多数の行にまたがるクラスを書くよりも、関数の1行を書く方が簡単です。

1
Euphoric